Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как запустить файл?
 
 автор: Shorr Kan   (22.03.2006 в 14:42)   письмо автору
 
 

Мне нужно, чтобы человек по заходу на страничку - запускал на отработку php-скрипт... но этот php-скрипт не должен ничего выдавать пользователю, не должен его задерживать - он должен сам отработать и записать результат в базу.
То есть, посетитель используется как запускающий фактор.

Как это можно сделать? Все функции разрешены.

   
 
 автор: Shorr Kan   (22.03.2006 в 15:30)   письмо автору
 
   для: 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 в 16:04)   письмо автору
 
   для: Shorr Kan   (22.03.2006 в 15:30)
 

Перепробовал все комментарии http://ru.php.net/exec ... ничего не сработало :(

   
 
 автор: kasmanaft   (22.03.2006 в 17:14)   письмо автору
 
   для: Shorr Kan   (22.03.2006 в 16:04)
 

а если include сделать?

   
 
 автор: Shorr Kan   (22.03.2006 в 17:58)   письмо автору
 
   для: kasmanaft   (22.03.2006 в 17:14)
 

"но этот php-скрипт не должен ничего выдавать пользователю, не должен его задерживать - он должен сам отработать и записать результат в базу."

Представьте, если скрипт отрабатывает десять минут.

   
 
 автор: kasmanaft   (22.03.2006 в 18:00)   письмо автору
 
   для: Shorr Kan   (22.03.2006 в 17:58)
 

а так да... вообще интересный вопрос... хотел бы тоже узнать :)

   
 
 автор: XPraptor   (22.03.2006 в 18:29)   письмо автору
 
   для: kasmanaft   (22.03.2006 в 18:00)
 

Перед загрузкой основной страницы, которая что-то возвращает, в ссылках через java в событии onclick открываешь файл в новом окне со своим скриптом и пусть себе работает, а фокус возвращаешь на текущую страницу, куда переходит юзер.
Размер окошка можешь сделать малюсенький для скрипта при открытии.

   
 
 автор: kasmanaft   (22.03.2006 в 18:34)   письмо автору
 
   для: XPraptor   (22.03.2006 в 18:29)
 

это как я понимаю будет popup... а если они отключены ?
наверно нужно, чтобы пользователь и не знал, что скрипт запущен...

   
 
 автор: XPraptor   (22.03.2006 в 18:39)   письмо автору
 
   для: kasmanaft   (22.03.2006 в 18:34)
 

Сам ты popup. Это обычное новое окно.

   
 
 автор: Shorr Kan   (22.03.2006 в 18:48)   письмо автору
 
   для: XPraptor   (22.03.2006 в 18:39)
 

Это не то. Почитайте об exec в комментариях - люди явно запускают ФОНОВЫЙ скрипт. Это и нужно. Яваскрипт тут и рядом не лежал.

   
 
 автор: Trianon   (22.03.2006 в 19:00)   письмо автору
 
   для: Shorr Kan   (22.03.2006 в 18:48)
 

Обычно в таких ситуациях делют следующим образом.
Люди ничего не запускают. Организуется очередь отложенных заданий.
Запросы от людей добавляют в эту очередь еще одно задание.
А периодически запускающийся процесс (по cron-у) её (очередь) разгребает и выполняет задания.
Очередь можно организовать как на файлах, так и в БД.
Добавление записи о задании - вещь мгновенная.

   
 
 автор: Денис   (22.03.2006 в 18:49)   письмо автору
 
   для: Shorr Kan   (22.03.2006 в 15:30)
 

Вы просто в начале скрипта файла а.php подключаете require_once(имя_файла), а в файле вы делаете все, что вам нужно, не нужно возвращать ничего(если только ваш скрипт сам ничего не возвращает) и все. Таким образом, пользователь заходит на страницу, по мере загрузки страницы выполнятся все ваши требования, а дальше загрузится сама страница. Так работают и счетчики посещений!

   
 
 автор: Shorr Kan   (22.03.2006 в 19:14)   письмо автору
 
   для: Денис   (22.03.2006 в 18:49)
 

Давайте предположим, что b.php выполняется десять минут? Никакого "а дальше" уже не будет.

Поясню мысль:

http://php.rinet.ru/manual/ru/function.exec.php

Замечание: Если вы собираетесь использовать эту функцию в программе, работающей в качестве демона, убедитесь, что стандартный вывод функции направлен в файл или другой поток, в противном случае PHP зависнет вплоть до конца выполнения программы.

и в комментариях обратите внимание на все встречающиеся слова "background" ...

Иными словами - нужно что-то, что запустить шелл-команду "php file.php" - и продолжит работу с пользователем. А сервер будет php'ничать с file.php

   
 
 автор: Денис   (23.03.2006 в 11:40)   письмо автору
 
   для: Shorr Kan   (22.03.2006 в 19:14)
 

В этом случает вам поможет cron. Вы пишете скрипт, после отсылаете cron-демону команду на то, чтобы выполнялся этот скрипт(в любое удобное для вас время). Сервер будет работать с одним файлом, а cron в указанное ему время будет запускать скрипт в указанном ему файле. Таким образом, система не будет тормозить, так как это будут совершенно разные потоки.
Если и в этот раз ответ не совсем тот, который вам нужно, если ваша задача не является глобальным секретом представьте ее на обсуждение, т.е. что вы хотите сделать изначально и что хотите получить в результате - возможно вам преложать другой вариант, другой обход проблемы.

   
 
 автор: Shorr Kan   (23.03.2006 в 14:31)   письмо автору
 
   для: Денис   (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($fp128);
         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 секунд, но не должно задержать и на секунду человека, зашедшего на родительский скрипт.

   
 
 автор: Денис   (23.03.2006 в 16:07)   письмо автору
 
   для: Shorr Kan   (23.03.2006 в 14:31)
 

Теперь понятно. С моей точки зрения, вердикт будет следующим: на данный момент РНР не сможет решить эту задачу - нужен сторонний Application server, на который можно возложить часть работы. Если условие "не cron", и чтобы "в фоновом режиме", эту задачу решить на данном этапе развития РНР нельзя. Это моя точка зрения, как человека, работающего около года с этим языком.

   
 
 автор: Shorr Kan   (23.03.2006 в 16:10)   письмо автору
 
   для: Денис   (23.03.2006 в 16:07)
 

Вы хотите сказать, что то что в php.net/exec столько комментариев - и почти в каждом пример с кодом... у них тоже ничего не вышло, хотя они эти примеры и писали? Я-то надеялся, что только у меня не работает...
Хотя... в любом справочнике об exec, system и фоновом режиме - написано...

   
 
 автор: Денис   (24.03.2006 в 11:31)   письмо автору
 
   для: 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, т.е. вывожу что-то, раздваивая основной поток перенаправления в файл. Пробуйте, должно работать.

   
 
 автор: Shorr Kan   (25.03.2006 в 16:10)   письмо автору
 
   для: Денис   (24.03.2006 в 11:31)
 

Сейчас буду проверять....

   
 
 автор: Shorr Kan   (25.03.2006 в 16:24)   письмо автору
 
   для: Shorr Kan   (25.03.2006 в 16:10)
 

Сделал, как вы написали. Все равно ждет выполнения. Но я делаю на unix.

   
 
 автор: Денис   (27.03.2006 в 11:00)   письмо автору
 
   для: Shorr Kan   (25.03.2006 в 16:24)
 

Странно, я запустил этот же пример - все в порядке, выполнения не ждет. По процессам РНР выполняется, файл постоянно растет и выполнения не ждет. Делаю под Linux. Проблема была в том, что не выгружается поток, попробуйте помодифицировать мой пример, я уверен, что он рабочий.

   
 
 автор: Trianon   (24.03.2006 в 11:35)   письмо автору
 
   для: Shorr Kan   (23.03.2006 в 16:10)
 

Вам совершенно всё равно, сколько параллельных процессов будет одновременно порождать обработка запросов клиентов?

   
 
 автор: Shorr Kan   (25.03.2006 в 16:09)   письмо автору
 
   для: Trianon   (24.03.2006 в 11:35)
 

Да, совершенно все равно.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования