PHP имеет поточную обработку?

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

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

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

129
задан Josh K 16 June 2010 в 19:10
поделиться

6 ответов

Нет ничего доступного, о котором я знаю. Следующая лучшая вещь состояла бы в том, чтобы просто иметь один сценарий, выполняют другого через CLI, но это является немного элементарным. В зависимости от того, что Вы пытаетесь сделать и насколько сложный это, это может или не может быть опцией.

40
ответ дан 24 November 2019 в 00:29
поделиться

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

17
ответ дан 24 November 2019 в 00:29
поделиться

Вот пример того, что Будет исполнено предложило:

$cmd = 'nohup nice -n 10 /usr/bin/php -c /path/to/php.ini -f /path/to/php/file.php action=generate var1_id=23 var2_id=35 gen_id=535 > /path/to/log/file.log & echo $!';
$pid = shell_exec($cmd);

В основном это выполняет Сценарий PHP в командной строке, но сразу возвращает PID и затем работает в фоновом режиме. ($ эха! гарантирует, что ничто иное не возвращается кроме PID.) Это позволяет Вашему Сценарию PHP продолжать или выходить, если Вы хотите. Когда я использовал это, я перенаправил пользователя к другой странице, где каждые 5 - 60 секунд вызов Ajax выполняется, чтобы проверить, работает ли отчет все еще. (У меня есть таблица для хранения gen_id и пользователя, с которым он связан.) Сценарий проверки выполняет следующее:

exec('ps ' . $pid , $processState);
if (count($processState) < 2) {
     // less than 2 rows in the ps, therefore report is complete
}

существует короткое сообщение на этой технике здесь: http://nsaunders.wordpress.com/2007/01/12/running-a-background-process-in-php/

48
ответ дан 24 November 2019 в 00:29
поделиться

Существует довольно неясен, и скоро быть удержанным от использования, функция, названная галочки . Единственная вещь, для которой я когда-либо использовал его, должен позволить сценарию получать SIGKILL (Ctrl+C) и закрываться корректно.

-3
ответ дан 24 November 2019 в 00:29
поделиться

pcntl_fork() - это то, что вы ищете, но это форкинг процессов, а не потоков. Поэтому у вас возникнет проблема обмена данными. Для ее решения вы можете использовать семафорные функции phps ( http://www.php.net/manual/de/ref.sem.php ) Очереди сообщений могут быть немного проще для начала, чем сегменты общей памяти.

В любом случае, стратегия, которую я использую в разрабатываемом мной веб-фреймворке, который параллельно загружает ресурсоемкие блоки веб-страницы (возможно, с внешними запросами): Я делаю очередь заданий, чтобы знать, какие данные я жду, а затем я отделяю задания для каждого процесса. После выполнения они хранят свои данные в кэше apc под уникальным ключом, к которому может получить доступ родительский процесс. Как только все данные там, он продолжает работу. Я использую простой usleep() для ожидания, потому что межпроцессное взаимодействие невозможно в apache (дети потеряют связь со своими родителями и станут зомби...). Так что это подводит меня к последнему вопросу: важно самоубивать каждого ребенка! Есть также классы, которые форкают процессы, но сохраняют данные, я не изучал их, но у zend framework есть один, и они обычно делают медленный, но надежный код. вы можете найти его здесь: http://zendframework.com/manual/1.9/en/zendx.console.process.unix.overview.html Я думаю, они используют сегменты shm! и последнее, но не менее важное: на этом сайте zend есть ошибка, небольшая ошибка в примере.

while ($process1->isRunning() && $process2->isRunning()) {
    sleep(1);
}
should of course be:
while ($process1->isRunning() || $process2->isRunning()) {
    sleep(1);
}
7
ответ дан 24 November 2019 в 00:29
поделиться

Если кому-то интересно, я возродил php_threading (не такой, как потоки, но похожий), и у меня он действительно работает до такой степени, что он работает (отчасти) хорошо!

Страница проекта

Загрузить (для Windows PHP 5.3 VC9 TS)

Примеры

README

13
ответ дан 24 November 2019 в 00:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: