Старый 09.05.2012, 04:03   #1
M@ZAX@KEP
 
Аватар для M@ZAX@KEP
 
Регистрация: 24.07.2010
Сообщений: 139
Репутация: 5
По умолчанию curl_exec всегда false, вывода ошибок нет

Доброе утро форуму. Сегодня я столкнулся с магией и всю ночь с ней боролся.
PHP код:
<?php
error_reporting
(E_ALL);
$key '5ec234eh85btjrt4e4';

function 
send($data1$data2$data3$data4){
    
$postdata urlencode(json_encode(array('api_key' => $key'mode' => '1''data_list' => array(array('a' => $data1'b' => $data2'c' => $data3'd' => $data4)))));
    if(
$ch curl_init()){ echo 'inited<br>'; }  //дебаг вывод :)
    
curl_setopt($chCURLOPT_CONNECTTIMEOUT0);
    
curl_setopt($chCURLOPT_TIMEOUT600);
    
curl_setopt($chCURLOPT_SSL_VERIFYPEERFALSE);
    
curl_setopt($chCURLOPT_RETURNTRANSFERTRUE);
    
curl_setopt($chCURLOPT_POSTTRUE);
    
curl_setopt($chCURLOPT_URL"https://host.com/api.php");
    
curl_setopt($chCURLOPT_POSTFIELDS$postdata);
    if(
$answ curl_exec($ch)){ echo 'executed<br>'; } //ещё дебаг
    
curl_close($ch);
    
$res json_decode(trim($answ));
    return 
$res->result;
}

echo 
send('somedata1''somedata2''some_more_data1''some_more_data2');
?>
Подразумевается, что всё просто, но... при запуске выводится только слово init. Получается, curl_exec не выполняется вообще. Почему- не ясно. При чём на локалке этот же самый скрипт выполняется и выводит надписи inited, executed и сам результат запроса. Версии php и curl одинаковые, только на хосте nginx+php-fpm. В phpinfo проверил, курл наместе. Никаких отчётов об ошибках, ничего абсолютно. Подозреваю, что дело именно в конфигурации хоста, но понятия не имею, куда именно там смотреть и что может влиять ещё.
Я уже даже php пересобрал. Тщетно. Последняя надежда как всегда на подмогу из сети
M@ZAX@KEP вне форума   Ответить с цитированием
Старый 09.05.2012, 11:26   #2
Pashkela
 
Аватар для Pashkela
 
Регистрация: 05.07.2010
Сообщений: 1,243
По умолчанию

CURLOPT_TIMEOUT, 600 ??? А почему не 6 000 ?

Цитата:
CURLOPT_TIMEOUT - Задает масимальное время выполнения операции в секундах
там что, ппц канал?

PS: Уверен, что ждал каждый раз 10 минут вывода ошибки?

плюс

Цитата:
max_execution_time integer

Эта директива задает максимальное время в секундах, в течение которого скрипт должен полностью загрузиться. Если этого не происходит, анализатор завершает его работу. Этот механизм помогает предотвратить зависание сервера из-за криво написанного скрипта. По умолчанию на загрузку дается 30 секунд. Если PHP запущен из командной строки, это значение по умолчанию равно 0.

На максимальное время выполнения не влияют системные вызовы, потоковые операции и т.п. За дополнительной информацией обращайтесь к документации к функции set_time_limit().

При работе в безопасный режим эту настройку нельзя изменить функцией ini_set(). Если значение все же нужно изменить, надо либо выключить безопасный режим, либо изменить значение прямо в php.ini.

Web-серверы обычно имеют свои настройки таймаута, по истечении которого сами завершают выполнение PHP скрипта. В Apache есть директива Timeout, в IIS есть функция CGI timeout. В обоих случаях по умолчанию установлено 300 секунд. Точные значения можно узнать из документации к Web-серверу.

Последний раз редактировалось Pashkela; 09.05.2012 в 11:35..
Pashkela вне форума   Ответить с цитированием
Старый 09.05.2012, 14:33   #3
M@ZAX@KEP
 
Аватар для M@ZAX@KEP
 
Регистрация: 24.07.2010
Сообщений: 139
Репутация: 5
По умолчанию

Цитата:
CURLOPT_TIMEOUT, 600 ??? А почему не 6 000 ?
Да я подумал многовато будет)) А так про запас =D
Глянул пыхинфо, у меня max_execution_time 30
Сделал TIMEOUT 30, ничего не изменилось. 20, 10 - то же самое. Не жду вообще - страница отдаётся nginx_ом сразу же. Как будто php пропускает вызов curl_exec.
Алсо, у нжинкса keep-alive 100 вроде... или 75. По-моему можно убавить же? На нём булка с небольшим числом пользователей. (< 50 пока)
M@ZAX@KEP вне форума   Ответить с цитированием
Старый 09.05.2012, 15:02   #4
pres
 
Регистрация: 09.07.2010
Сообщений: 19
Репутация: 0
По умолчанию

фаервол наверное, проверь сокетами или файловыми функциями коннект, для начала
pres вне форума   Ответить с цитированием
Старый 09.05.2012, 15:21   #5
M@ZAX@KEP
 
Аватар для M@ZAX@KEP
 
Регистрация: 24.07.2010
Сообщений: 139
Репутация: 5
По умолчанию

Код:
root@vps:~# iptables --list      
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
Пусто... других фаерволов не ставил (если только debian не имеет что-то дефолтное, что блокирует всё подряд) что ещё проверить?
M@ZAX@KEP вне форума   Ответить с цитированием
Старый 10.05.2012, 10:45   #6
oRb
 
Аватар для oRb
 
Регистрация: 01.07.2010
Сообщений: 319
Репутация: 138
По умолчанию

ini_set('display_errors', 'stdout');
в начало скрипта
__________________
Не оказываю никаких услуг.
I don't provide any services.
oRb вне форума   Ответить с цитированием
Старый 10.05.2012, 12:31   #7
v1d0q
 
Аватар для v1d0q
 
Регистрация: 09.07.2010
Сообщений: 91
Репутация: 85
По умолчанию

У тебя в url https, возможно проблема в OpenSSL. Как вариант.
v1d0q вне форума   Ответить с цитированием
Старый 10.05.2012, 15:53   #8
M@ZAX@KEP
 
Аватар для M@ZAX@KEP
 
Регистрация: 24.07.2010
Сообщений: 139
Репутация: 5
По умолчанию

oRb, попробовал. Ничего, вывода не появилось, всё то же самое.

v1d0q, на SSL браузер ругаться-то ругается, но заходит. В скрипте для этого же "curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);" Или не спасёт? Ах да, на других хостах скрипт работает.

Попробовал (безуспешно) убрать строки
PHP код:
curl_setopt($chCURLOPT_CONNECTTIMEOUT30);
curl_setopt($chCURLOPT_TIMEOUT30); 
Так и станешь суеверным. В порчи верить будешь, в сглазы...

BTW
Цитата:
fastcgi.error_header no value
display_errors On
display_startup_errors Off
Первая строчка не может повлиять? Вот отсюда из первого абзаца я правильно понял, что если у меня будет какая-нибудь parse error, она хрен выведется?
M@ZAX@KEP вне форума   Ответить с цитированием
Старый 10.05.2012, 16:12   #9
chupakabra
 
Аватар для chupakabra
 
Регистрация: 09.12.2011
Сообщений: 47
Репутация: 5
По умолчанию

Перед curl_close($ch); добавь:

PHP код:
if ( curl_errno$ch ) )
{
  echo 
'Curl error: ' curl_error$ch );

chupakabra вне форума   Ответить с цитированием
Старый 11.05.2012, 15:10   #10
M@ZAX@KEP
 
Аватар для M@ZAX@KEP
 
Регистрация: 24.07.2010
Сообщений: 139
Репутация: 5
По умолчанию

Отоно чё...
Цитата:
Curl error: SSL: certificate subject name (bla-bla.biz) does not match target host name 'host.com'
chupakabra, крайне признателен!
v1d0q, ты был прав насчёт того что что-то с SSL =)

Оказывается (внезапно =D) есть ещё и CURLOPT_SSL_VERIFYHOST. Дописал:
PHP код:
curl_setopt($chCURLOPT_SSL_VERIFYHOSTFALSE); 
Заработало.
Спасибо всем-всем, кто отвечал, проблема решена, я счастлив!
Пойду воткну что-нибудь горячее админу сервиса с таким сертификатом...
M@ZAX@KEP вне форума   Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot