|
|
|
| Мне нужно, чтобы человек по заходу на страничку - запускал на отработку php-скрипт... но этот php-скрипт не должен ничего выдавать пользователю, не должен его задерживать - он должен сам отработать и записать результат в базу.
То есть, посетитель используется как запускающий фактор.
Как это можно сделать? Все функции разрешены. | |
|
|
|
|
|
|
|
для: Shorr Kan
(22.03.2006 в 14:42)
| | Я попробовал так:
a.php
file_get_contents('b.php');
|
b.php
$fp=fopen('log.txt','a+');fwrite($fp,'1');fclose($fp);
|
Бесполезно, в файл ничего не пишется.
Вариант с exec('echo b.php >>log.txt'); - тоже не прошел. При нем в b.php был print, а не fwrite. | |
|
|
|
|
|
|
|
для: Shorr Kan
(22.03.2006 в 15:30)
| | Перепробовал все комментарии http://ru.php.net/exec ... ничего не сработало :( | |
|
|
|
|
|
|
|
для: Shorr Kan
(22.03.2006 в 16:04)
| | а если include сделать? | |
|
|
|
|
|
|
|
для: kasmanaft
(22.03.2006 в 17:14)
| | "но этот php-скрипт не должен ничего выдавать пользователю, не должен его задерживать - он должен сам отработать и записать результат в базу."
Представьте, если скрипт отрабатывает десять минут. | |
|
|
|
|
|
|
|
для: Shorr Kan
(22.03.2006 в 17:58)
| | а так да... вообще интересный вопрос... хотел бы тоже узнать :) | |
|
|
|
|
|
|
|
для: kasmanaft
(22.03.2006 в 18:00)
| | Перед загрузкой основной страницы, которая что-то возвращает, в ссылках через java в событии onclick открываешь файл в новом окне со своим скриптом и пусть себе работает, а фокус возвращаешь на текущую страницу, куда переходит юзер.
Размер окошка можешь сделать малюсенький для скрипта при открытии. | |
|
|
|
|
|
|
|
для: XPraptor
(22.03.2006 в 18:29)
| | это как я понимаю будет popup... а если они отключены ?
наверно нужно, чтобы пользователь и не знал, что скрипт запущен... | |
|
|
|
|
|
|
|
для: kasmanaft
(22.03.2006 в 18:34)
| | Сам ты popup. Это обычное новое окно. | |
|
|
|
|
|
|
|
для: XPraptor
(22.03.2006 в 18:39)
| | Это не то. Почитайте об exec в комментариях - люди явно запускают ФОНОВЫЙ скрипт. Это и нужно. Яваскрипт тут и рядом не лежал. | |
|
|
|
|
|
|
|
для: Shorr Kan
(22.03.2006 в 18:48)
| | Обычно в таких ситуациях делют следующим образом.
Люди ничего не запускают. Организуется очередь отложенных заданий.
Запросы от людей добавляют в эту очередь еще одно задание.
А периодически запускающийся процесс (по cron-у) её (очередь) разгребает и выполняет задания.
Очередь можно организовать как на файлах, так и в БД.
Добавление записи о задании - вещь мгновенная. | |
|
|
|
|
|
|
|
для: Shorr Kan
(22.03.2006 в 15:30)
| | Вы просто в начале скрипта файла а.php подключаете require_once(имя_файла), а в файле вы делаете все, что вам нужно, не нужно возвращать ничего(если только ваш скрипт сам ничего не возвращает) и все. Таким образом, пользователь заходит на страницу, по мере загрузки страницы выполнятся все ваши требования, а дальше загрузится сама страница. Так работают и счетчики посещений! | |
|
|
|
|
|
|
|
для: Денис
(22.03.2006 в 18:49)
| | Давайте предположим, что b.php выполняется десять минут? Никакого "а дальше" уже не будет.
Поясню мысль:
http://php.rinet.ru/manual/ru/function.exec.php
Замечание: Если вы собираетесь использовать эту функцию в программе, работающей в качестве демона, убедитесь, что стандартный вывод функции направлен в файл или другой поток, в противном случае PHP зависнет вплоть до конца выполнения программы.
|
и в комментариях обратите внимание на все встречающиеся слова "background" ...
Иными словами - нужно что-то, что запустить шелл-команду "php file.php" - и продолжит работу с пользователем. А сервер будет php'ничать с file.php | |
|
|
|
|
|
|
|
для: Shorr Kan
(22.03.2006 в 19:14)
| | В этом случает вам поможет cron. Вы пишете скрипт, после отсылаете cron-демону команду на то, чтобы выполнялся этот скрипт(в любое удобное для вас время). Сервер будет работать с одним файлом, а 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
(23.03.2006 в 14:31)
| | Теперь понятно. С моей точки зрения, вердикт будет следующим: на данный момент РНР не сможет решить эту задачу - нужен сторонний Application server, на который можно возложить часть работы. Если условие "не cron", и чтобы "в фоновом режиме", эту задачу решить на данном этапе развития РНР нельзя. Это моя точка зрения, как человека, работающего около года с этим языком. | |
|
|
|
|
|
|
|
для: Денис
(23.03.2006 в 16:07)
| | Вы хотите сказать, что то что в php.net/exec столько комментариев - и почти в каждом пример с кодом... у них тоже ничего не вышло, хотя они эти примеры и писали? Я-то надеялся, что только у меня не работает...
Хотя... в любом справочнике об exec, system и фоновом режиме - написано... | |
|
|
|
|
|
|
|
для: 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, т.е. вывожу что-то, раздваивая основной поток перенаправления в файл. Пробуйте, должно работать. | |
|
|
|
|
|
|
|
для: Денис
(24.03.2006 в 11:31)
| | Сейчас буду проверять.... | |
|
|
|
|
|
|
|
для: Shorr Kan
(25.03.2006 в 16:10)
| | Сделал, как вы написали. Все равно ждет выполнения. Но я делаю на unix. | |
|
|
|
|
|
|
|
для: Shorr Kan
(25.03.2006 в 16:24)
| | Странно, я запустил этот же пример - все в порядке, выполнения не ждет. По процессам РНР выполняется, файл постоянно растет и выполнения не ждет. Делаю под Linux. Проблема была в том, что не выгружается поток, попробуйте помодифицировать мой пример, я уверен, что он рабочий. | |
|
|
|
|
|
|
|
для: Shorr Kan
(23.03.2006 в 16:10)
| | Вам совершенно всё равно, сколько параллельных процессов будет одновременно порождать обработка запросов клиентов? | |
|
|
|
|
|
|
|
для: Trianon
(24.03.2006 в 11:35)
| | Да, совершенно все равно. | |
|
|
|