PHP Продолжить выполнение функции после оператора return

1

Возможно ли это? Если нет, то каковы другие способы сделать это лучше всего?

Я пытаюсь:

  1. Верните true после успешного вызова функции.
  2. Пусть вызываемая функция все еще выполняется даже после оператора return.

Чтобы сделать все более ясным:

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!

  • 0
    Вы можете попробовать что-то с разветвлением, но я не вижу никакой пользы для этого ...
  • 0
    я думаю, вы должны вложить несколько функций одна в другую. Одна функция для каждого возвращаемого значения. Функция контейнера вернет коллекцию всех значений, возвращаемых функциями внутри. Но это не очень хороший способ сделать это, и, вероятно, вы можете переосмыслить свою логику, чтобы получить один код, который сделает все
Показать ещё 2 комментария
Теги:

2 ответа

2

То, что вы ищете, называется "асинхронной" обработкой. Такая вещь существует на некоторых языках, особенно javascript, но не изначально в php. Есть некоторые расширения, но они не очень распространены, так как это немного противоречит идее и силе php.

Обычно используются два альтернативных подхода, причем второй вариант, безусловно, лучший:

  1. вы отправляете обычный ответ клиенту и используете функцию ignore_client_abort. Эта функция позволяет продолжить обработку даже после отправки ответа. Обратите внимание, однако, что обработка большего количества данных в таком синхронном режиме является сомнительной: вы, скорее всего, столкнетесь с некоторыми из многих лимитов php, реализованных по соображениям безопасности. Таким образом, вам придется поднимать все эти ограничения, что снижает вашу защиту от использования пропусков и ошибок.

  2. вы используете планировщик заданий для хранения заданий обработки данных и уведомляете клиента о том, что вы получили данные и создали задания обработки. Затем вы обрабатываете каждое задание в очереди один за другим с помощью cronjob или аналогичного, поэтому независимо от клиентского запроса. Вы получаете дополнительные баллы, если вы реализуете представление состояния очереди для клиента :-)

    Существуют рамки для таких вещей, в основном они делают, чтобы создавать записи в базе данных, по одному для каждой работы. Затем у вас есть одно задание cron, которое периодически запускается (каждую минуту). Это задание проверяет, обрабатывается ли еще одно задание, если он не выбирает следующий и начинает обработку. Обычно обработка выполняется за вызовы php-cli независимо от среды веб-сервера. Это также означает, что вы можете даже выполнять задания в другой системе для лучшей производительности. Вы отделили обработку от веб-gui.

1

Если вы хотите одновременно запускать больше функций, PHP поддерживает многопоточность. Вот простой, но отличный пример того, что он может сделать: как можно использовать многопоточность в PHP-приложениях

Также см. Http://php.net/manual/en/class.thread.php

Ещё вопросы

Сообщество Overcoder
Наверх
Меню