Рецепты программирования на PHP или практические советы по программированию → Отправляем данные формы автоматически методом POST
Практическая необходимость в использовании автоматической отправки данных возникает не так часто, тем не менее, лично я, не раз убеждался в полезности этой функции. Например, если требуется переслать данные между двумя несвязанными серверами. Я использовал этот скрипт, чтобы связать воедино два сервера работающих под разными операционными системами Windows / UNIX и базами данных MS SQL / MySQL. Этим методом можно переносить бинарные или длинные файлы между серверами, например, картинки. В общем, полезностей весьма много, особенно если говорить про полностию автоматизированные веб-сервисы.
Этот метод также позволяет проделывать весьма дурные штучки. Например, постить миллион сообщений в разные форумы в автоматическом режиме. Кстати, капчи довольно неплохо защищают форумы от автоматических публикаций, но и против них есть пути обхода. Об этом поговорим в другой раз. Можно логинится в защищенные паролем зоны сайтов и брать оттуда информацию, подделывать cookies и реферреры, и много других злодейств.
Резюмируя скажу, что в серьезном автоматизированном веб-сервисе скорее всего пригодится функция автоматического POST'а.
Ниже приведен скрипт, осуществляющий отправку данных методом POST. Метод POST, в отличие от метода GET, посылает данные на сервер не в строке запроса (которая как правило ограничена в размере), а в области данных, после HTTP заголовка. Передача нескольких переменных аналогична методу GET: группы имя=значение объединяются при помощи амперсанда. Кодировать массив удобнее всего через встроенную функцию http_build_query.
Кстати, аналогичные функции есть уже встроенные, например, в пакет curl.
| 1 | //передает массив $data методом POST |
| 2 | function _post($host,$path,$data) { |
| 3 | $res = FALSE; |
| 4 | if(!$fp = fsockopen($host, 80, $errno, $errstr, 30)) return $errstr." ".$errno; |
| 5 | $edata = http_build_query($data)."\r\n\r\n"; |
| 6 | $headers = "POST ".$path." HTTP/1.1\r\n"; |
| 7 | $headers.= "Host: ".$host."\r\n"; |
| 8 | $headers.= "Content-type: application/x-www-form-urlencoded\r\n"; |
| 9 | $headers.= "Content-Length: ".strlen($edata)."\r\n"; |
| 10 | $headers.= "Connection: Close\r\n\r\n"; |
| 11 | fwrite($fp, $headers.$edata); |
| 12 | while (!feof($fp)) $res .= fgets($fp, 1024); |
| 13 | fclose($fp); |
| 14 | return $res; |
| 15 | } |
| 16 | |
| 17 | $data = array( |
| 18 | "pic" => "GIF89...some binary data..." |
| 19 | ,"width"=>12 |
| 20 | ,"height"=>34 |
| 21 | ); |
| 22 | echo "Ответ сервера: "._post("domain.ru","somedir/index.html",$data); |
Если надо проанализировать как сервер воспринял переданную ему информацию, то необходимо "разобрать" ответ сервера. Например, так:
| 1 | $response = _post("domain.ru","somedir/index.html",$data); |
| 2 | if(preg_match("/HTTP\/1\.1 200 OK/",$response)) echo $response; |
| 3 | else echo "Ошибка: ".$response; |
