У меня есть PHP-скрипт, который вызывается из задания cron каждую минуту. Этот скрипт берет некоторую информацию из базы данных, а затем вызывает другой скрипт PHP, используя Системную функцию (передавая ей некоторые параметры).
Это означает, что я могу запустить до 10 сценариев из этого «основного». И что бы я хотел сделать, так это то, что я бы назвал сценарий и продолжал выполнение основного скрипта, то есть не дожидался завершения системного вызова, а затем вызвал следующий.
Как это может быть сделано?
Вы можете использовать proc_open()
, stream_select()
и stream_set_blocking()
совместно для достижения такого рода вещей.
Если это звучит расплывчато, я собираюсь вставить здесь большой кусок кода, который я использовал в недавнем проекте, который сделал что-то подобное, но потом почувствовал, что это может помешать, а не помочь! Таким образом, код работал следующим образом:
Теперь причина, по которой я расплывчата и удобна в том, что наши многочисленные экземпляры здесь обрабатываются cronjob не PHP. Я пытался сделать то, о чем вы говорите, и что-то очень хорошо работает с pcntl_fork()
и друзьями, но в конце я столкнулся с несколькими проблемами (если я помню, что хотя бы один из них был ошибкой в PHP) и решил, что этот подход был гораздо более солидным способом добиться того же. YMMV.
Хорошо стоит посмотреть на эти функции, но вы можете добиться многого с ними. Хотя почему-то я не думаю, что PHP когда-либо станет языком программирования сокетов выбора … 🙂
Если ваша ОС поддерживает его, вы можете использовать функцию pcntl_fork () для выключения дочерних процессов, которые родитель не ждет. Будьте осторожны, но легко создать слишком много дочерних процессов, особенно если они занимают больше времени, чем ожидалось!
Я не уверен, что PHP поддерживает потоки. Проверьте здесь .
Я думаю, что ответ будет очень похож на те, которые уже предусмотрены для асинхронных вызовов PHP .
Это только * NIX, но вы можете разветвлять свой скрипт с помощью расширения PCNTL.
используйте версию вилки или потоки php.
Вы можете запустить их в фоновом режиме:
system('php yourscript.php &');
Вам просто нужно убедиться, что вы проверяете общее количество запущенных процессов. В общем, не очень элегантное решение. Вместо cron вы можете позволить одному сценарию работать навсегда, я думаю, что-то вроде этого:
<?php while(true) { // do whatever needs to be done. } ?>
Осторожно. PHP точно не известен как демона.