HttpSendRequest не ждет завершения PHP-скрипта

Я отправляю HTTP POST request из своего приложения C++ в PHP-скрипт на сервере. Использование HttpOpenRequest/HttpSendRequest/etc. В настоящее время он ожидает завершения выполнения PHP-скрипта, прежде чем HttpSendRequest вернется. Можно ли как-то изменить эту функцию?

Я отправляю данные непосредственно перед закрытием моего приложения C++, поэтому я не хочу, чтобы оно сидело там более 10 секунд в ожидании завершения выполнения PHP-скрипта. Я просто хочу, чтобы он отправил данные, а затем закрыл приложение.

Одна вещь, о которой я думал, заключалась в том, чтобы PHP-скрипт порождал другой PHP-скрипт в другом процессе с помощью команды exec, чтобы первый скрипт возвращался сразу. Однако я отправляю много данных с моим запросом HTTP POST, поэтому мне нужно передать эти данные порожденному процессу.

В идеале я просто хочу установить флаг, чтобы сообщить HttpSendRequest не ждать. Я не мог видеть ничего очевидного в документах, но, возможно, что-то упустил.


person Dan    schedule 08.12.2010    source источник


Ответы (2)


Вы можете захотеть ignore_user_abort() в своем PHP-скрипте. Затем вы можете закрыть соединение с вашего клиента C после отправки данных, и PHP продолжит делать то, что он должен делать.

person rik    schedule 08.12.2010
comment
Проблема в том, что блокирует HttpSendRequest. Поэтому я не могу закрыть соединение, пока эта функция не вернется. - person Dan; 08.12.2010
comment
Но он блокируется только до тех пор, пока не получит ответ, верно? php.net/manual/en/features.connection-handling. php#71172 - person rik; 08.12.2010
comment
Ага! Код из ссылки, которую вы разместили, - это то, что я хотел, а также вызов ignore_user_abort(). Заголовок (Connection: close) плюс функции ob_* позволяют мне закрыть соединение раньше. Возможно, стоит обновить свой пост этой информацией, если у кого-то еще есть эта проблема. Спасибо :-) - person Dan; 08.12.2010

Вы можете вызвать InternetOpen с помощью INTERNET_FLAG_ASYNC, и ваш обратный вызов не будет иметь никаких последствий.

Вот пример кода для начала:

http://www.codeproject.com/KB/IP/asyncwininet.aspx

Затем (как предлагает rik) вызовите ignore_user_abort(true); в верхней части вашего PHP-скрипта, чтобы убедиться, что он выполняется полностью.

ignore_user_abort

person webbiedave    schedule 08.12.2010