как запустить функцию php (не внешний процесс) в фоновом режиме? - PullRequest
0 голосов
/ 10 февраля 2011

Как я могу запустить функцию PHP в фоновом режиме, а не процесс?Например, я должен сделать:

(php code)
1º) retrieve data from database#1
2º) retrieve data from database#2
3º) If #1 and #2 have finished, do my calculations.

Функции # 1 и # 2 также являются PHP-кодом.Я не хочу использовать «exec» или «system», так как они не являются внешними процессами, они также являются PHP-кодом!Я предполагаю, что должен существовать какой-нибудь умный способ запустить функцию или строку PHP в фоновом режиме, просто так.Есть идеи?

Ответы [ 4 ]

3 голосов
/ 10 февраля 2011

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

Вам потребуется запустить отдельный процесс PHP, который работает через отдельный скрипт.

*) есть pcntl_fork для CLI и, возможно, режима CGI, но в нем есть подводные камни, документация и примеры по этому кажутся редкими, это ограничено Unix / Linux, и я предполагаю Вы все равно находитесь в контексте веб-страницы, где это не работает.

0 голосов
/ 07 октября 2013

Php поддерживает многопоточность (требуется PthL pthreads> = 0,34)

пример вы найдете здесь http://php.net/manual/en/thread.start.php

0 голосов
/ 10 февраля 2011

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

Что касается вашего конкретного вопроса, есть способы сделать это. Вы можете использовать MySQLi::multi_query(). Первый запрос необходимо завершить, прежде чем вы сможете использовать результаты второго запроса

$mysqli->multi_query($sql1 . ';' . $sql2);
$result1 = $mysqli->store_result();
$rows1 = $result1->fetch_all();
$result2 = $mysqli->store_result();
$rows2 = $result2->fetch_all();

Оба запроса выполняются бок о бок. Результаты возвращаются синхронно, но это работает.

Вы также можете эмулировать потоки, используя register_tick_function(). Есть некоторые документы онлайн о , чтобы фактически использовать тики для работы с потоками . Но я должен предупредить вас, что обычно очень плохая идея пытаться злоупотреблять ими таким образом, поскольку это не совсем верная многопоточность, она не будет вести себя так (операторы по-прежнему выполняются в порядке оператор блокировки будет блокировать все).

0 голосов
/ 10 февраля 2011

Вы можете настроить cURL multi handler, который может запускать различные сценарии (и получать от них данные) параллельно.Это, на мой взгляд, лучший вариант для запуска многопоточных скриптов в PHP.

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

http://php.net/manual/en/function.curl-multi-exec.php

Вот несколько примеров использования:

http://codestips.com/php-multithreading-using-curl/

https://web.archive.org/web/20091014034235/http://www.ibuildings.co.uk/blog/archives/811-Multithreading-in-PHP-with-CURL.html

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