У меня есть следующий (урезанный) кусок коды:PHP fsockopen клиент не получает отправлен данные
function curl_request_async($url, $params)
{
foreach ($params as $key => $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);
fwrite($fp, "$type ".$parts['path']." HTTP/1.1\r\n");
fwrite($fp, "Host: ".$parts['host']."\r\n");
fwrite($fp, "Content-Type: application/x-www-form-urlencoded\r\n");
fwrite($fp, "Content-Length: ".strlen($post_string)."\r\n");
fwrite($fp, "Connection: Close\r\n\r\n");
$bytes_written = fwrite($fp, $post_string);
var_dump($bytes_written, strlen($post_string));
// fread($fp, 1);
// fflush($fp);
fclose($fp);
}
Проблема с этим кодом является то, что я не нашел никаких доказательств запроса достиг серверов с именем. Строка var_dump($bytes_written, strlen($post_string));
вышла int(493) int(493)
, поэтому она должна была получить все данные, но это не так.
Если у меня возникли проблемы с работой fread($fp, 1);
, это работает без проблем. Это может быть рабочим решением, но, похоже, это не имеет смысла. Там должен быть лучший путь!
Мой вопрос тогда двоякий: почему fread($fp, 1);
исправить мою проблему и есть ли лучшее решение?
Не пытайтесь написать свой собственный клиентый HTTP в PHP, если вы не очень компетентны в обеих технологиях и имеет несколько месяцев пощадить работать на это полное время , Просто перечисление ошибок в коде, который вы представили, выйдет за рамки ответа здесь. Используйте завиток. Я знаю, что документация по PHP плохо, но документы библиотеки C немного лучше, и это работает. – symcbean
@symcbean его не так сложно, если вы хотите поддерживать HTTPS и согласование содержимого и переадресацию и длину контента и все эти фантазии, конечно, но если вы просто собираетесь на простой клиент http GET, это не совсем жесткий. GET url \ r \ nheader1 \ r \ nheader2 \ r \ n \ r \ nbody ~ – hanshenrik
@hansherik: глядя на код, который вы предоставили, он кажется вам сверх ваших способностей. Сокет TCP не является жестким. Пример, который вы указали выше, еще шире от марки, чем код Лекса. – symcbean