Привет, ребята. В настоящее время я запускаю PHP-скрипт, используя CURL для отправки данных на другой сервер, чтобы запустить PHP-скрипт, который может занять до минуты. Этот сервер не возвращает данные. Но CURL-запрос все равно должен дождаться завершения, а затем загрузит остальную часть страницы orignal. Я хотел бы, чтобы мой PHP-скрипт просто отправлял данные на другой сервер, а затем не дождался ответа.
Итак, мой вопрос: как мне это решить? Я читал, что CURL всегда должен ждать. Каковы ваши предложения?
Спасибо!
Это может быть полезной отправной точкой, грубо отпечатанной здесь
function curl_post_async($url, $params) { foreach ($params as $key => &$val) { if (is_array($val)) $val = implode(',', $val); $post_params[] = $key.'='.urlencode($val); } $post_string = implode('&', $post_params); $parts=parse_url($url); $fp = fsockopen($parts['host'], isset($parts['port'])?$parts['port']:80, $errno, $errstr, 30); //pete_assert(($fp!=0), "Couldn't open a socket to ".$url." (".$errstr.")");(optional) $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); }
http://php.net/manual/en/function.fsockopen.php
$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30); if (!$fp) { echo "$errstr ($errno)
\n"; } else { $out = "GET / HTTP/1.1\r\n"; $out .= "Host: www.example.com\r\n"; $out .= "Connection: Close\r\n\r\n"; fwrite($fp, $out); while (!feof($fp)) { echo fgets($fp, 128); } fclose($fp); }
Вы можете создать сокет сервера на другом компьютере, к которому подключается ваша веб-страница PHP. Таким образом, вы определяете протокол. В противном случае проверьте, соответствует ли фоновый процесс вашим потребностям.
Я думаю, что вы можете установить максимальное время выполнения в php, чтобы остановить работу скрипта по истечении срока. Это не «про» решение, но оно работает!
Лучше использовать флаг TIMEOUT для выхода в течение периода времени.
curl_easy_setopt(curl, CURLOPT_TIMEOUT, sec); // sec is int variable
Это был код C, приспособился.