Возможно ли это? Если нет, то каковы другие способы сделать это лучше всего?
Я пытаюсь:
Чтобы сделать все более ясным:
function foo() {
var $data; // a very large data
var $check = $this->bar($data); // gets true
if ($check) {
echo "FOO: Bar received my message!";
}
}
function bar($data) {
return true; // returns true, now foo doesn't care what bar will do
echo "BAR: returned true to foo, will now call foobar!";
// some code to process $data
$this->foobar(); // but hopefully still execute this line
}
function foobar() {
echo "FOOBAR: Hello, World!";
return;
}
Ожидаемый результат: (асинхронно)
FOO: Bar received my message!
BAR: returned true to foo, will now call foobar!
FOOBAR: Hello, World!
То, что вы ищете, называется "асинхронной" обработкой. Такая вещь существует на некоторых языках, особенно javascript, но не изначально в php. Есть некоторые расширения, но они не очень распространены, так как это немного противоречит идее и силе php.
Обычно используются два альтернативных подхода, причем второй вариант, безусловно, лучший:
вы отправляете обычный ответ клиенту и используете функцию ignore_client_abort
. Эта функция позволяет продолжить обработку даже после отправки ответа. Обратите внимание, однако, что обработка большего количества данных в таком синхронном режиме является сомнительной: вы, скорее всего, столкнетесь с некоторыми из многих лимитов php, реализованных по соображениям безопасности. Таким образом, вам придется поднимать все эти ограничения, что снижает вашу защиту от использования пропусков и ошибок.
вы используете планировщик заданий для хранения заданий обработки данных и уведомляете клиента о том, что вы получили данные и создали задания обработки. Затем вы обрабатываете каждое задание в очереди один за другим с помощью cronjob или аналогичного, поэтому независимо от клиентского запроса. Вы получаете дополнительные баллы, если вы реализуете представление состояния очереди для клиента :-)
Существуют рамки для таких вещей, в основном они делают, чтобы создавать записи в базе данных, по одному для каждой работы. Затем у вас есть одно задание cron, которое периодически запускается (каждую минуту). Это задание проверяет, обрабатывается ли еще одно задание, если он не выбирает следующий и начинает обработку. Обычно обработка выполняется за вызовы php-cli независимо от среды веб-сервера. Это также означает, что вы можете даже выполнять задания в другой системе для лучшей производительности. Вы отделили обработку от веб-gui.
Если вы хотите одновременно запускать больше функций, PHP поддерживает многопоточность. Вот простой, но отличный пример того, что он может сделать: как можно использовать многопоточность в PHP-приложениях