Есть ли причина, по которой сервер PHP cURL enblaed откажется отображать ответы xml? Я работаю над сценарием для отправки номеров в службу набора номера. Я чувствовал, что лучше всего использовать cURL.

На 3 разных серверах, на каждом из которых работают разные версии PHP, я могу без проблем получать ответы. Но на конкретном сервере, сколько бы я ни пытался, я просто получаю пустой ответ.

Это сценарий, о котором идет речь:

<?php
if ($_POST['request_callback'])
{
$customer_name      = cleaninput($_REQUEST['customer_name'],"text");
$debtor_id          = cleaninput($_REQUEST['debtor_id'],"number");
$telephone_number   = cleaninput($_REQUEST['customer_number'],"number");

$xml_request = '<?xml version="1.0" encoding="utf-8"?>';
$xml_request .= '<CallRequest>';
$xml_request .= '<ProjectName>Noble Test</ProjectName>';
$xml_request .= '<ContactNumberToDial>'.$telephone_number.'</ContactNumberToDial>';
if (isset($_POST['callme_now'])) {
    $xml_request .= '<DateTimeToDial></DateTimeToDial>';
} else {
    $xml_request .= '<DateTimeToDial>' . date('Y-m-d ' . $_POST['hour_select'] . ':' . $_POST['minute_select'] . ':s') . '</DateTimeToDial>';
}
$xml_request .= '<ListSource>WebLead</ListSource>';
$xml_request .= '<AgentName></AgentName>';
$xml_request .= '<AddToList>False</AddToList>';
$xml_request .= '<SpecificAgent>False</SpecificAgent>';
$xml_request .= '<DBField>';
$xml_request .= '<FieldName>Name</FieldName>';
$xml_request .= '<FieldValue>NobleTesting</FieldValue>';
$xml_request .= '</DBField>';
$xml_request .= '</CallRequest>';

$loginUsername = "username";
$loginPassword = "password";
//$user_agent    = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1";

// Send using CURL
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, "http://194.217.1.2/ClickToCall/CallRequest.asmx/Call");          // URL to post
//curl_setopt( $ch, CURLOPT_USERAGENT, $user_agent);
curl_setopt( $ch, CURLOPT_USERPWD, "$loginUsername:$loginPassword"); //login
curl_setopt( $ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
// curl_setopt( $ch, CURLOPT_HEADER, 1);  // make sure we get the header
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 ); // return into a variable
curl_setopt( $ch, CURLOPT_POST, 1);
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );    # required for https urls
curl_setopt( $ch, CURLOPT_POSTFIELDS, 'xmlString=' . urlencode($xml_request));
curl_setopt( $ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt( $ch, CURLINFO_HEADER_OUT, 1);
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
$result = curl_exec( $ch ); // runs the post
curl_close($ch);

}
?>

Это хорошо работает везде, кроме этого конкретного сервера, где ответ не отправляется обратно. Я также использовал Firebug для проверки заголовков запроса и ответа, и оба оказались пустыми.

Кто-нибудь может помочь?

Благодарность

Джеймс

1
James 15 Дек 2009 в 21:45
В чем разница между серверами? (разные ОС, версия PHP и т.д.)
 – 
Jordan Ryan Moore
15 Дек 2009 в 22:48
Привет, Джордан! На одном из серверов работает PHP 5.3.0 в системе Windows Hosted, на другом — PHP 5.2.11 в системе Linux, а на другом — PHP 5.2.9 в системе Linux. Все эти 3 работают без проблем. Тот, который отказывается работать, использует PHP 5.2.5 в системе Linux. Я ожидал получить ответ от всех 4, но только 3 дают мне ответ, а последний еще не включен cURL. Одна мысль, что php_info отключен на последнем сервере. Будет ли это иметь эффект?
 – 
James
15 Дек 2009 в 23:39
Джеймс, php_info не повлияет. Однако что вы подразумеваете под «php_info отключен». Вы имеете в виду, что у вас нет страницы, отображающей php_info? Это на самом деле хорошо. Вы не должны оставлять сервер включенным, чтобы кто-то мог получить публичный доступ к php_info. Это угроза безопасности. Вы подтвердили, что 4-й сервер может обслуживать любую веб-страницу? У вас есть тестовая страница, которую вы можете посетить, чтобы убедиться, что Apache правильно работает на этом компьютере?
 – 
Justin Noel
16 Дек 2009 в 18:36
Привет, Джастин, в основном 4-й ящик уже запущен и работает и в настоящее время обслуживает довольно много веб-страниц. Сегодня я провел несколько тестов. В других 3 полях (от Firebug в Firefox) длина содержимого заголовков ответа всегда больше 0, что указывает на то, что ответ отправляется обратно с сервера набора номера. На 4-м поле длина содержимого всегда равна 0. Забавно, что тот же скрипт используется для сбора информации с платежного шлюза на 4-м поле, и ответ возвращается без проблем. Виноват ли сервер дозвона!?
 – 
James
16 Дек 2009 в 19:52

2 ответа

Во всяком случае, я нашел решение проблемы. Похоже, что сервер набора номера не принимал передачи, начавшиеся с запроса HEAD. В итоге мне пришлось изменить некоторые части моего скрипта, чтобы использовать CURLOPT_CUSTOMREQUEST с GET.

По крайней мере, на этот раз я получаю ответ. Так что это сделало свое дело.

1
James 18 Дек 2009 в 11:35

Попробуйте это, чтобы убедиться, что 4-й блок действительно правильно настроен для обслуживания веб-страниц:

Из терминала командной строки:

$ telnet 194.217.1.2 80  (press enter)

Вы должны получить ответ вроде:

Пытаюсь 192.168.245.84... Подключился к 194.217.1.2. Экранирующий символ '^]'.

Введите это:

GET /ClickToCall/CallRequest.asmx/Call HTTP/1.1 (press enter)
Host: 194.217.1.2 (press enter twice)

Вы должны получить примерно такой ответ с другой HTML-информацией:

HTTP/1.1 200 OK Дата: среда, 16 декабря 2009 г. 15:40:13 GMT Сервер: Apache/1.3.31 (Unix) PHP/4.3.8 X-Powered-By: PHP/4.3.8 Передача-кодирование: фрагментированное содержимое -Тип: текст/html

248

Домашняя страница службы обеспечения качества сети Некоторые материалы здесь

0
Justin Noel 16 Дек 2009 в 18:44