Я ищу эквивалент PHP для VB Doevents - PullRequest
1 голос
/ 04 июля 2011

Я ищу PHP-эквивалент для VB doevents. Я написал пакет для анализа в реальном времени на VB и использовал doevents для выпуска в операционную систему. Doevents позволяет мне оставаться в памяти и работать непрерывно, не заполняя память, и позволяет мне реагировать на ввод пользователя. Я переписал пакет в PHP, и я ищу ту же самую функцию doevents. Если бы его не было, я мог бы перенести себя и уйти. Но в настоящее время я не знаю, как это сделать, и я думаю, что это добавит намного больше накладных расходов. Спасибо, gerardg

Ответы [ 4 ]

3 голосов
/ 03 февраля 2012

usleep - это то, что вы ищете. Задерживает выполнение программы на указанное количество микросекунд. http://php.net/manual/en/function.usleep.php

2 голосов
/ 04 июля 2011

Я не совсем уверен, какие аспекты doevents вы хотите подражать, так что вот почти все, что может быть полезно для вас.

Вы можете использовать ob_implicit_flush(true)вверху вашего скрипта, чтобы включить неявную очистку буфера вывода.Это означает, что всякий раз, когда ваш скрипт вызывает echo или print или что-то еще, что вы используете для отображения материала, PHP автоматически отправляет все это в браузер пользователя.Вы также можете просто использовать ob_flush() после каждого вызова, чтобы отобразить что-то, что больше похоже на Application.DoEvents() в VB в отношении поддержания вашего пользовательского интерфейса активным, но должно вызываться каждый раз, когда что-то выводится.

Естественно, если ваш сценарий уже использует выходной буфер, вы можете создать копию буфера перед сбросом с помощью ob_get_contents().

Если вам нужно разрешить сценариюВы можете работать дольше, чем обычно, вы можете установить более длительный тайм-аут с помощью set_time_limit($time).Если вам нужно больше памяти и у вас есть доступ для редактирования файла .htaccess, поместите следующий код и отредактируйте значение:

php_value memory_limit 64M

Устанавливает ограничение памяти в 64 мегабайта.

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

Если мне не хватает чего-то важного в DoEvents (), дайте мне знать, и я постараюсьпомочь вам заставить его работать.

2 голосов
/ 04 июля 2011

Прошло почти 10 лет с тех пор, как я в последний раз что-то писал на VB, и, насколько я помню, функция doevents () позволяла приложению уступать процессору во время интенсивной обработки (обычно для запуска других системных событий - наиболее распространенным из них является WM_PAINT. чтобы ваш пользовательский интерфейс не казался зависшим).

Я не думаю, что PHP обладает такой функциональностью - ваш скрипт будет работать как один процесс и завершаться (либо когда он будет завершен, либо когда он достигнет 30-секундного тайм-аута по умолчанию).

Если вы думаете с точки зрения потоков (как это обычно делает большинство программистов Windows) и вам нужно порождать более 1 экземпляра вашего скрипта, возможно, вам следует взглянуть на функции управления процессами PHP как Начните.

0 голосов
/ 21 июня 2015

PHP разработан для асинхронной обработки по требованию.Однако его можно заставить выполнять фоновую задачу с небольшим количеством хакеров.

Поскольку PHP работает как один поток, вам не нужно беспокоиться о том, чтобы позволить процессору делать другие вещи, о которых уже позаботились.Если бы это было не так, то веб-сервер мог бы обслуживать только одну страницу за раз, а все остальные запросы должны были бы находиться в очереди.Вам нужно будет написать какой-то вид, который никогда не истекает, пока не произойдет какое-либо обнаруживаемое условие (например, сообщение «сейчас, пожалуйста, выход», которое вы установили в БД или что-то в этом роде).

Как указали другие, вам потребуетсяset_time_limit($something); с, возможно, usleep, останавливая выполнение кода "слишком быстро", если он потребляет очень много ресурсов ЦП в каждом цикле.Однако, если вы также используете соединение с базой данных, большая часть времени вашего сценария фактически является сценарием, ожидающим базу данных (безусловно, самые большие накладные расходы для сценария).

Я видел рабочие потоки PHP, созданные с использованием screen иотстраняя его от фоновой задачи.Другие подходы также работают до тех пор, пока у вас нет сеанса, который истекает или завершается (например, когда веб-браузер закрыт).Cron, который запускает скрипт, чтобы проверить, выполняется ли скрипт каждые x минут или часов, дает вам автоматическое восстановление из принудительного существования и / или перезапуска системы.

TL; DR: doevents «запекается» в PHP ивам не нужно об этом беспокоиться.

...