CodeIgniter RESTful, асинхронный / фоновый процесс

Я использую API-интерфейс CodeIgniter RESTful (https://github.com/philsturgeon/codeigniter-restserver), который возвращает информацию (формат json) в мое приложение Android и iphone.

Есть операция, в которой я отправляю некоторые значения, если это все ОК, я возвращаю код 200 в качестве ответа.

Теперь я хочу добавить новую операцию по тому же методу: отправлять уведомления об этих изменениях с помощью APNS (служба Apple Notificationacion Service) и GCM (Google Cloud Messaging).

Он работает хорошо, когда я должен отправлять не более 3-5 уведомлений, проблема заключается в APNS, потому что я должен отправлять эти сообщения один за другим, и это занимает много времени, поэтому мои приложения получают исключение тайм-аута (все уведомления являются отправлено, но пользователь получает сообщение об ошибке …)

Могу ли я отправить ответ кода 200, а затем продолжить отправку этих уведомлений? (Что-то вроде этого…)

function my_update_method_post(){ //....GET my POST values update($data); $this->response(array('result'=>1),200)); //Send Notifications .... } 

Заранее спасибо…

Я нашел решение, которое идеально подходит для меня, потому что я не ожидаю никакого значения результата. Если уведомление не может быть отправлено … я зарегистрирую его в своей базе данных.

Это функция, которую я использую для отправки запроса «async» (да, это не асинхронный запрос, но он работает так, как я ищу)

 function curl_post_async($url, $params) { $post_string = http_build_query($params); $parts=parse_url($url); $fp = fsockopen($parts['host'], isset($parts['port'])?$parts['port']:80, $errno, $errstr, 30); if(!$fp) { //Perform whatever logging you want to have happen b/c this call failed! } $out = "POST ".$parts['path']." HTTP/1.1\r\n"; $out.= "Host: ".$parts['host']."\r\n"; $out.= "Content-Type: application/x-www-form-urlencoded\r\n"; $out.= "Content-Length: ".strlen($post_string)."\r\n"; $out.= "Connection: Close\r\n\r\n"; if (isset($post_string)) $out.= $post_string; fwrite($fp, $out); fclose($fp); } 

Да, это возможно.

Вы должны посмотреть на PHP exec () и эту ссылку. Вы должны настроить функцию в контроллере для вызова из командной строки. вы затем передадите массив данных GCM / APNS, который будет использоваться.

Это решение не идеально, потому что вы не сможете сообщить клиенту, что все сообщения были успешно отправлены. Вы отправите обратно 200, чтобы сказать, что запрос был получен нормально, и это все.

Так как PHP не поддерживает нити или вызовы функции асинхронных функций, вам придется использовать своеобразное хакерское решение. Взгляните на мой вопрос здесь: PHP file_get_contents () follow Content-length header

Решение состоит в том, чтобы отправить заголовок Connection: Close и Content-Length , а затем заставить клиента знать эти заголовки (см. Ссылку выше). В случае завитки, например, соединение будет закрыто, как только будет достигнута длина контента, но ваш PHP-скрипт все еще работает «в фоновом режиме», поэтому вы можете приступить к трудоемким операциям.

С уважением,

Стефан

PS Если сценарий занимает очень много времени, убедитесь, что время максимальной загрузки PHP не мешает вам

Взгляните на эту статью . Мне нравится это решение гораздо больше, чем тот, где у вас есть клиент, чтобы сервер немедленно повесил трубку; есть много преимуществ, если вы создадите это решение на стороне сервера.

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

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

Я не понял, что у OP нет доступа к сервису. В этом случае статья, о которой я упоминал, имеет мало значения. Проблема здесь в том, что сервер занимает много времени, чтобы реагировать и подвешивать клиента. Для этого я предлагаю curl_multi_init . Это позволяет одновременно выполнять несколько запросов.