Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:
null
. null
. null
, как если бы это был массив. null
, как если бы это был массив. null
как будто это было значение Throwable. Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null
.
Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html
Нет ничего доступного, о котором я знаю. Следующая лучшая вещь состояла бы в том, чтобы просто иметь один сценарий, выполняют другого через CLI, но это является немного элементарным. В зависимости от того, что Вы пытаетесь сделать и насколько сложный это, это может или не может быть опцией.
Можно использовать pcntl_fork () для достижения чего-то подобного потокам. Технически это - отдельные процессы, таким образом, коммуникация между этими двумя не так проста с потоками, и я полагаю, что это не будет работать, если PHP назовет апач.
Вот пример того, что Будет исполнено предложило:
$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/
Существует довольно неясен, и скоро быть удержанным от использования, функция, названная галочки . Единственная вещь, для которой я когда-либо использовал его, должен позволить сценарию получать SIGKILL (Ctrl+C) и закрываться корректно.
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);
}
Если кому-то интересно, я возродил php_threading (не такой, как потоки, но похожий), и у меня он действительно работает до такой степени, что он работает (отчасти) хорошо!