Завершение запроса cURL - PullRequest
0 голосов
/ 30 октября 2010

Я пытаюсь сделать своего рода PHP-ботом. Идея состоит в том, чтобы иметь php-файлы с именами a.php и b.php. a.php что-то делает, затем спит 30 секунд, вызывает b.php, b.php завершает запрос Http, выполняет некоторую обработку, а затем вызывает a.php, который завершает запрос Http и т. д.

Единственная проблема сейчас заключается в том, как завершить запрос Http, сделанный с помощью cURL. Я попробовал этот код ниже:

<?php
ob_end_clean();
header("Connection: close");
ignore_user_abort(); // optional
ob_start();
echo ('Text the user will see');
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush();     // Will not work
flush();            // Unless both are called !

// At this point, the browser has closed connection to the web server

// Do processing here
echo('Text user will never see');

Небольшая проблема в том, что это не работает, и я на самом деле вижу «Текст пользователь никогда не увидит». Я пробовал работу cron и тому подобное, но хост не позволяет этого. Я также не могу отправить ограничение времени ожидания скрипта. Поэтому мой единственный вариант - создавать повторяющиеся сценарии php. Так как бы я отправил запрос Http?

Ответы [ 2 ]

1 голос
/ 30 октября 2010

На основе нового понимания вашей проблемы. Вы создаете систему, которая каждые 30 секунд проверяет удаленный URL-адрес для отслеживания фрагмента содержимого. Для этого я рекомендую CRON, который может быть либо на основе сервера: http://en.wikipedia.org/wiki/Cron, либо на основе Интернета, если ваш хост не разрешает это: http://www.webbasedcron.com/ (пример).

0 голосов
/ 30 октября 2010

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

Причина, по которой вы видите вывод в конце, заключается в том, что в конце скрипта PHP вызовет неявный сброс (см. Ob_implicit_flush в руководстве), но вы закрываете соединение с браузером, заканчивая скрипт PHP.

Пути вокруг этого:

Возможно, вы сможете использовать set_time_limit для увеличения лимита исполнения. НЕ ИСПОЛЬЗУЙТЕ НОЛЬ. Соблазнительно сказать «возьми столько времени, сколько нужно» в сценарии пост-обработки, но в этом и заключается сумасшествие и горькие системные администраторы, и помните, что вы все еще работаете с секундомером тайм-аута curl (хотя вы можете расширить его как опцию). set_time_limit (5) даст вам еще пять секунд, поэтому периодически это позволит вам выполнить постобработку, но - если вы будете осторожны - все равно защитит вас от бесконечных циклов. Инфинити-циклы без ограничений на выполнение в контексте запросов Apache также могут сделать вас непопулярными с вашим системным администратором.

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

Но вы, похоже, пытаетесь запустить обычный пакетный процесс в системе, где они не хотят, чтобы вы это делали - или они бы дали вам доступ к cron - поэтому ваш лучший и самый надежный способ - найти хост, который фактически поддерживает то, что вы пытаетесь сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...