PHP curl положил 500 ошибок
У меня есть запрос на завивки, который отлично работает на моем локальном хосте, но на реальном сервере он возвращает 500 ошибок. Вот мой код:
public static function send( $xml )
{
$xml = str_replace( "\n", "", $xml );
//Write to temporary file
$put_data = tmpfile();
fwrite( $put_data, $xml );
fseek( $put_data, 0 );
$options = array(
CURLOPT_URL => 'http://*****************/cgi-bin/commctrl.pl?SessionId=' . Xml_helper::generate_session_id() . '&SystemId=live',
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_HTTPHEADER => array( 'Content-type: text/xml' ),
CURLOPT_PUT => TRUE,
CURLOPT_INFILE => $put_data,
CURLOPT_INFILESIZE => strlen( $xml )
);
$curl = curl_init();
curl_setopt_array( $curl, $options );
$result = curl_exec( $curl );
curl_close( $curl );
return $result;
}
У меня есть завиток включен на сервере!
Есть ли у кого-нибудь идеи, почему он не работает на сервере? Я нахожусь на общем хостинге, если это помогает.
Я также включил отчет об ошибках в верхней части файла, но после завершения завитки ошибки не появляются. Я просто получаю общую страницу ошибок 500.
Спасибо
UPDATE:
Я был в контакте с клиентом, и они подтвердили, что полученная информация получена и вставлена в их бэк-офисную систему. Поэтому это должно быть связано с ответом, который является причиной. Это небольшой блок xml, который, как предполагается, должен быть возвращен.
ДРУГОЕ ОБНОВЛЕНИЕ
Я пробовал тот же script на другом сервере и heroku, и я все равно получаю тот же результат.
ДРУГОЕ ОБНОВЛЕНИЕ
Думаю, я нашел путь к проблеме. Кажется, что script тайм-аут из-за тайм-аута в FastCGI, и поскольку я нахожусь на общем хостинге, я не могу его изменить. Может ли кто-нибудь подтвердить это?
ЗАКЛЮЧИТЕЛЬНОЕ ОБНОВЛЕНИЕ
Я связался с моим хостинг-провайдером, и они подтвердили, что script был тайм-аут из-за значения тайм-аута на сервере, а не того, с которым я могу получить доступ с любой функцией PHP или ini_set().
Ответы
Ответ 1
Если ошибка, как вы думаете, связана с таймаутом script, и у вас нет доступа к файлу php.ini - есть легкое исправление
просто используйте set_time_limit(INT)
где INT - это количество секунд, в начале вашего script, чтобы переопределить параметры в файле php.ini
Установка тайм-аута set_time_limit(128)
должна решить все ваши проблемы и обычно принимается как разумный верхний предел
Дополнительную информацию можно найти здесь http://php.net/manual/en/function.set-time-limit.php
Ответ 2
Вот несколько вещей, которые можно попробовать:
-
Измените изменчивость в script - для тестирования, hardcode - идентификатор сеанса, так что завиток будет одним и тем же. Вы не можете надежно проверить что-то, если оно изменяется при каждом его запуске.
-
Попробуйте использовать curl прямо из командной строки, используя что-то вроде curl http://*****************/cgi-bin/commctrl.pl?SessionId=12345&SystemId=live
. Это покажет вам, действительно ли проблема связана с самим компьютером или чем-то связана с PHP.
-
Проверьте журналы на своем сервере, возможно, что-то вроде /var/log/apache/error.log в зависимости от того, какую ОС использует ваш сервер. Также просмотрите журнал доступа, чтобы вы могли видеть, действительно ли вы получаете тот же запрос.
-
Наконец, если у вас действительно закончились идеи, вы можете использовать такую программу, как wireshark или tcpdump/WinDump для мониторинга соединение, чтобы вы могли сравнивать пакеты, отправляемые с каждого компьютера. Это даст вам представление о том, как они отличаются друг от друга - они искажены брандмауэром? Является ли php добавлением дополнительных заголовков в один из них? Различаются ли значения CURL по умолчанию, приводящие к включению разных данных?
Ответ 3
Я подозреваю, что ваш сервер не поддерживает tmpfile(). Просто для проверки:
public static function send( $xml ) {
$xml = str_replace( "\n", "", $xml );
//Write to temporary file
$put_data = tmpfile();
if (!$put_data) die('tmpfile failed');
...
Если вы находитесь на сервере GoDaddy, проверьте это... https://stackoverflow.com/questions/9957397/tmpfile-returns-false-on-godaddy-server
Ответ 4
Какой сервер на самом деле показывает 500? из вашего кода он кажется локальным сервером, а не удаленным.
изменение
public static function send( $xml )
{
к
public static function send( $xml )
{
error_reporting(E_ALL);
if(!function_exists('curl_exec')) {
var_dump("NO CURL");
return false;
}
Это работает?
Ответ 5
Это почти наверняка не параметр тайм-аута php.
Если вы используете FastCGI, как вы заявили, вам необходимо отредактировать этот файл:
/etc/httpd/conf.d/fcgid.conf
И измените:
FcgidIOTimeout 3600
Тогда do:
service httpd restart
Это заставляло меня сумасшедшим в течение 3 дней. Самый верный ответ на это неверен!