Асинхронные функции в PHP внутри веб-API

1

Привет, я не большой эксперт на стороне сервера. Я написал длинную функцию веб-сервиса, которая выполняет ряд запросов и процессов и обычно иногда отправляет push-уведомления в конце функции пользователям 1-20 iPhone.

Теперь, когда вы отправляете широкомасштабные push-уведомления пользователям iPhone, вам нужно поставить задержку в 1 секунду между каждым нажатием. Это упростит простой запрос api так долго, как 30 секунд.

Я хочу избежать этого, есть ли способ, когда я вызываю web api, он запускает весь код и запускает новый поток или страницу внутри сервера и отправляет push-уведомления без остановки оригинального api и отправляет данные обратно в мобильное приложение, тем временем выполняя функцию отдельно на сервере для отправки push-уведомлений.

Мы не хотим использовать какие-либо задания cron, также веб-api вычисляет список пользователей, поэтому функция push может быть вызвана только внутри.

$this->sendPushNotification($friendsList, $userId);
                    $response = array(
                            'error'=>false,
                            'invalidKey'=>false,
                            'message'=>"Your query has completed"
                            );
                    $this->jsonOutput($response);

Теперь я хочу отправить jsonOutput в ближайшее время, когда запрос будет завершен, не дожидаясь, когда sendPushNotification будет принудительно. Проще говоря, я хочу запустить функцию асинхронно в php.

  • 0
    Вы все еще работаете над этим?
Теги:
iphone

1 ответ

1

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

Посмотрите на эти два вопроса. Читайте о pthreads. Там также отличный пост здесь на многозадачности и асинхронной обработки:

<?php

function work() {
    /* Do some work */

    return 'result';
}    

$dispatcher = new Amp\Thread\Dispatcher;

// call 2 functions to be executed asynchronously
$promise1 = $dispatcher->call('work');
$promise2 = $dispatcher->call('work');

$comboPromise = Amp\all([$promise1, $promise2]);
list($result1, $result2) = $comboPromise->wait();

РЕДАКТИРОВАТЬ

Если ваш push-скрипт - push.php, а другой скрипт - api.php:

<?php 

function processAll() {
    exec('nohup /usr/bin/api.php > /dev/null 2>&1 &');
    exec('nohup /usr/bin/push.php > /dev/null 2>&1 &');
}

EDIT 2

Вам нужно будет удобно писать сценарии командной строки. Убедитесь, что вы можете запускать их самостоятельно в командной строке, прежде чем пытаться вставить их в exec() - вам может потребоваться префикс команды с помощью php, то есть nohup/usr/bin/PHP скрипт.php (опять же, вы можете запустить это в командной строки для проверки).

  • 0
    я не могу использовать многопоточность прямо сейчас из-за ограничений сервера и php. Я должен снять все apis и установить несколько вещей, чтобы включить безопасную работу с потоками. я проверил первый. <? php exec ('nohup / usr / bin / my-command> / dev / null 2> & 1 &'); ?> Как мне запустить мою функцию внутри этого exec
  • 0
    Я только что добавил псевдокод внизу моего ответа. Пойди и доложи.
Показать ещё 4 комментария

Ещё вопросы

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