Свернутый текст
function background_query($url)
{
$parts = parse_url($url);
$fp = fsockopen(
$parts['host'],
(isset($parts['port']) ? $parts['port'] : 80),
$errno,
$errstr,
30
);
if(!$fp)
return false;
else
{
$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($parts['query']) . "\r\n";
$out .= "Connection: Close\r\n\r\n";
if(isset($parts['query']))
$out .= $parts['query'];
fwrite($fp, $out);
fclose($fp);
return true;
}
}
$param = array('i' => 'test', 'value' => 'some', 123, 'test1' => 'test2');
background_query('http://site.ru/test.php?text='.urlencode(json_encode($param)));
Смысл ее в том, чтобы открыть соединение, передать данные и закрыть соединение, не дожидаясь пока вызванный скрипт завершит работу.
Хочу заметить, что в ф-и постоянно выполняется блок else.
На локалке все работает как часы, все отлично, а вот после заливки на сервер скрипт работает через раз, то есть вызвал эту ф-ю, она вызвала файл и передала в него данные, я увидел результат, после этого опять перезагружаю страницу, но результата уже нету... С десяток раз страницу по-перезагружал результат появился... потом опять нету..., не понятно... :blink:
Решил сделать это с помощью curl, получился такой код
Свернутый текст
$ch = curl_init('http://site.ru/q/test.php');
$opts = array(
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => 'test=' . json_encode(array('i' => 'test', 'value' => 'some', 123, 'test1' => 'test2')),
CURLOPT_TIMEOUT_MS => 100
);
curl_setopt_array($ch, $opts);
curl_exec($ch);
curl_close($ch);
Работает безотказно (пока, надеюсь и дальше так же будет :))
Только вот какой вопрос меня волнует, дабы не дожидаться полного завершения работы вызываемого скрипта, я поставил таймаут 100мс. (CURLOPT_TIMEOUT_MS), а это как я понимаю не закрытие соединения, а его обрыв (или я ошибаюсь?). и если мы обрываем соединение то соответственно нету гарантии, что мы успеем вызвать нужный нам скрипт и передать ему все данные, верно? Как можно решить этот вопрос?