|
|
|
|
|
для: Shorr Kan
(25.03.2006 в 16:24)
| | Странно, я запустил этот же пример - все в порядке, выполнения не ждет. По процессам РНР выполняется, файл постоянно растет и выполнения не ждет. Делаю под Linux. Проблема была в том, что не выгружается поток, попробуйте помодифицировать мой пример, я уверен, что он рабочий. | |
|
|
|
|
|
|
|
для: Shorr Kan
(25.03.2006 в 16:10)
| | Сделал, как вы написали. Все равно ждет выполнения. Но я делаю на unix. | |
|
|
|
|
|
|
|
для: Денис
(24.03.2006 в 11:31)
| | Сейчас буду проверять.... | |
|
|
|
|
|
|
|
для: Trianon
(24.03.2006 в 11:35)
| | Да, совершенно все равно. | |
|
|
|
|
|
|
|
для: Shorr Kan
(23.03.2006 в 16:10)
| | Вам совершенно всё равно, сколько параллельных процессов будет одновременно порождать обработка запросов клиентов? | |
|
|
|
|
|
|
|
для: Shorr Kan
(23.03.2006 в 16:10)
| | Решил все-таки проверить ваш пример, так как действительно задело :). Написал следующий пример:
main.php
<?php
exec('echo OK! | C:\php5\php.exe main.php >> log.txt');
?
|
index.php
<?php
set_time_limit(60);
ignore_user_abort(true);
$i = 0;
while(true) {
sleep(3);
echo $i++ ." ";
}
?>
|
Запустил...и все работает. Вы просто не переправили поток вывода, а именно: echo OK! | C:\php5\php.exe, т.е. вывожу что-то, раздваивая основной поток перенаправления в файл. Пробуйте, должно работать. | |
|
|
|
|
|
|
|
для: Денис
(23.03.2006 в 16:07)
| | Вы хотите сказать, что то что в php.net/exec столько комментариев - и почти в каждом пример с кодом... у них тоже ничего не вышло, хотя они эти примеры и писали? Я-то надеялся, что только у меня не работает...
Хотя... в любом справочнике об exec, system и фоновом режиме - написано... | |
|
|
|
|
|
|
|
для: Shorr Kan
(23.03.2006 в 14:31)
| | Теперь понятно. С моей точки зрения, вердикт будет следующим: на данный момент РНР не сможет решить эту задачу - нужен сторонний Application server, на который можно возложить часть работы. Если условие "не cron", и чтобы "в фоновом режиме", эту задачу решить на данном этапе развития РНР нельзя. Это моя точка зрения, как человека, работающего около года с этим языком. | |
|
|
|
|
|
|
|
для: Денис
(23.03.2006 в 11:40)
| | Ответ не тот, вы правы.
Задачу, в данном случае, можно поставить так. Вот один из комментариев:
19-Mar-2005 07:13
I noticed that a couple of contributers planned on having threads running in background while operation continues.
If you have a script that will function for itself there is an easy solution: call it through fsockopen (request to webserver) and do not wait for the answer. To make sure process is called correctly on all operating systems I had to add an fgets but break after first couple of bytes.
example main script
<?php
echo "This is main thread, returning immediately";
$fp = fsockopen( <addyourcalltoscript> );
//fputs($fp, <yourvariablestosend>);
while(!feof($fp)){
fgets($fp, 128);
break;
}
fclose($fp);
?>
example child script
<?php
// make sure script runs without stopping //
set_time_limit(0);
ignore_user_abort(true);
// your code
?>
|
Обратите внимание на: call it through fsockopen (request to webserver) and do not wait for the answer
Суть кода - ясна и понятна, и работать это действительно должно. Но оно не работает. Либо дочерний скрипт не выполняется, либо родительский - ждет его выполнения. При этом - в disable_functions - пусто.
Вышеприведенный комментарий - не работает, хотя должен. Все аналоги кода в этом комментарии - тоже не работают.
Задача - запустить скрипт посетителем (не cron'ом) в фоновом режиме. Посетитель скрипт запускает и продолжает работать (может даже отключиться... или бродить по сайту), а скрипт выполняется сервером, независимо от посетителя.
Это называется "фоновым режимом". Да, это выполняет крон, да, кроном это сделать можно. Да... Но я хочу добиться работы именно запуска фонового скрипта - по http-запросу. То есть, мне не нужен обход проблемы. Мне нужно решение задачи "запустить дочерний скрипт в фоновом режиме, при заходе на сайт". Обходить эту задачу другим путём - всё равно что советовать человеку, незнающему дорогу, но желающему дойти до другого города пешком - сесть на электричку.
Для проверки, в дочернем скрипте можно использовать код записи в файл цифирки циклом до сотни, со sleep(1); - это задержит время выполнения дочернего скрипта на 100 секунд, но не должно задержать и на секунду человека, зашедшего на родительский скрипт. | |
|
|
|
|
|
|
|
для: Shorr Kan
(22.03.2006 в 19:14)
| | В этом случает вам поможет cron. Вы пишете скрипт, после отсылаете cron-демону команду на то, чтобы выполнялся этот скрипт(в любое удобное для вас время). Сервер будет работать с одним файлом, а cron в указанное ему время будет запускать скрипт в указанном ему файле. Таким образом, система не будет тормозить, так как это будут совершенно разные потоки.
Если и в этот раз ответ не совсем тот, который вам нужно, если ваша задача не является глобальным секретом представьте ее на обсуждение, т.е. что вы хотите сделать изначально и что хотите получить в результате - возможно вам преложать другой вариант, другой обход проблемы. | |
|
|
|
|