[решено] выполнение скрипта php каждые 5 секунд (обрывается выполнение предыдущей итерации)

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
kingpin
Сообщения: 5

[решено] выполнение скрипта php каждые 5 секунд

Сообщение kingpin »

Всем привет,
задача: главный скрипт через curl обращается к гейту на другом серве, этот гейт делает точно такой же запрос на третий серв, а ответ потом передает первому(главному), и при этом главный скрипт выполняется каждые пять секунд (вернее он локально проверяет сначала нужно ли ему обращаться на гейт и если да, то делает это).

такое обращение к гейту занимает чуть менее минуты.

вот шел код вызова каждые 5 сек:

Код: Выделить всё

#!/bin/sh

while true; do
/usr/bin/php /path/to/script/cli.php "cron"
sleep 5
done


проблема состоит в том, что запрос на третий сервер доходит, но вот ответ на первый серв нет... такое ощущение, что работа главного скрипта прерывается.
если я вызываю скрипт из браузера, то получаю все ответы на 100%
подскажите, пожалуйста, как сделать, чтобы главный скрипт отрабатывал правильно?
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5456
ОС: Gentoo

Re: [решено] выполнение скрипта php каждые 5 секунд

Сообщение /dev/random »

В опубликованном вами коде всё в порядке. Проблема где-то ещё.
Спасибо сказали:
Аватара пользователя
kingpin
Сообщения: 5

Re: [решено] выполнение скрипта php каждые 5 секунд

Сообщение kingpin »

/dev/random писал(а):
30.05.2012 15:31
В опубликованном вами коде всё в порядке. Проблема где-то ещё.


а где может быть проблема, если я через браузер вызываю скрипт, то все работает, через cli - нет! уже увеличил лимиты на выполнение и в главном и во втором скриптах, и увеличил таймаут curl, ничего не помогает
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5456
ОС: Gentoo

Re: [решено] выполнение скрипта php каждые 5 секунд

Сообщение /dev/random »

kingpin писал(а):
30.05.2012 15:56
а где может быть проблема, если я через браузер вызываю скрипт, то все работает, через cli - нет! уже увеличил лимиты на выполнение и в главном и во втором скриптах, и увеличил таймаут curl, ничего не помогает

Возможно, ваш php-скрипт использует какую-то особенность, которая отсутствует в php при вызове из командной строки. Без полной картины можно только гадать на кофейной гуще.
Спасибо сказали:
Kopilov
Сообщения: 957
ОС: [K]Ubuntu, Debian

Re: [решено] выполнение скрипта php каждые 5 секунд

Сообщение Kopilov »

Сравните вывод phpinfo() при вызове из браузера и из cli. Возможно, используются разные php.ini (в Gentoo -- по умолчанию разные). Возможно попутное изменение конфигурации Web-сервером.
Возможно, причина в запуске от разных пользователей -- а это, скорее всего, так: apache (или под кем там сервер крутится) должен быть заблокирован для входа через терминал, а у пользователя, под которым вы входите, может не хватать прав.
Спасибо сказали:
Аватара пользователя
kingpin
Сообщения: 5

Re: [решено] выполнение скрипта php каждые 5 секунд

Сообщение kingpin »

вот код главного скрипта, именно он вызывается каждые 5 секунд (немного повырезал, оставил только те ветки, кот нужны):
используется framework CodeIgniter

Код: Выделить всё

public function index()
    {

        $this->db->select('id, name, ns1, ns2, ip, old_ip, old_ns1, old_ns2, do_in_line, order_id, reseller_type');
        $this->db->where(array('in_line'=>1));
        $this->db->order_by('time_in_line', 'asc');
        $q = $this->db->get('domains', 1);

        if($q->num_rows() < 1) return;
        $out = false;
        $domain = $q->row_array();
                    $this->db->set(array('in_line'=>3));
                    $this->db->where(array('id'=>$domain['id']));
                    $this->db->update('domains');

                    $ch = curl_init();

                    curl_setopt($ch, CURLOPT_HEADER, false);
                    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                    curl_setopt($ch, CURLOPT_POST, true);
                    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //Don't verify ssl certificate
                    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120);
                    curl_setopt($ch, CURLOPT_TIMEOUT, 120);
                    curl_setopt($ch, CURLOPT_USERAGENT, 'Opera/9.80 (Windows NT 6.0; U; pl) Presto/2.10.229 Version/11.62');

                    $url = "http://gate_server.com/cron.php";
                    $user_name = 'some_user';
                    $api_key = 'some_key';
                    $ip = 'some_ip';
                    $domain_name = $domain['name'];

                    $zone = explode('.',$domain['name']);
                    $sld = $zone[0];
                    if(count($zone)>2)
                        $tld = $zone[sizeof($zone)-2].'.'.$zone[sizeof($zone)-1];
                    else
                        $tld = $zone[sizeof($zone)-1];

                    $Contact = array(
                        'FirstName' => 'Sergey',
                        'LastName' => 'Davidov',
                        'Address1' => urlencode('Baker str. 23'),
                        'City' => urlencode('New York'),
                        'StateProvince' => 'NY',
                        'PostalCode' => '10023',
                        'Country' => 'US',
                        'Phone' => '+1.5323433226',
                        'EmailAddress' => 'serg_davidov@yahoo.com'
                    );
                    $contcts_types = array('Registrant', 'AuxBilling', 'Tech', 'Admin');

                    switch($domain['do_in_line'])
                    {
                            case '1':
                                    $comand = 'namecheap.domains.create';
                                    $request = "ApiUser={$user_name}&ApiKey={$api_key}&".
                                            "UserName={$user_name}&Command={$comand}&".
                                             "ClientIp={$ip}".
                                    "&DomainName={$domain_name}&Years=1";
                                    foreach($contcts_types as $c_type)
                                    {
                                        foreach($Contact as $key=>$value)
                                            $request .= '&'.$c_type.$key.'='.$value;
                                    }
                                    if($this->write_logs)
                                    {
                                            $this->load->helper('file');
                                            write_file('/path/to/logs/cron_1.log', @date("d.m.Y h:i:s").' - request : '.$request."\r\n", "a+");
                                    }
                                    //echo $request;
                                    curl_setopt($ch, CURLOPT_URL, $url);

                                    curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
                                    set_time_limit(180);
                                    $out = curl_exec($ch);
                                    //echo $out;
                                    curl_close($ch);
                                    if($out)
                                    {
                                            $this->load->model('billing');
                                            $result = $this->billing->xml2array($out);
                                            if($this->write_logs)
                                            {
                                                    echo json_encode($result);
                                                    write_file('/path/to/logs/cron_1.log', @date("d.m.Y h:i:s").' + response : '.json_encode($result)."\r\n", "a+");
                                            }
                                            if($result['ApiResponse_attr']['Status'] == 'OK')
                                            {
                                                $CreateResults = $result['ApiResponse']['DomainCreateResult_attr'];
                                                if($CreateResults['Registered'] == 'true')
                                                {
                                                        $this->db->set(array('in_line'=>0, 'time_in_line'=>0, 'do_in_line'=>0, 'reg_date'=>time(), 'order_id' => $CreateResults['OrderID']));
                                                        $this->db->where(array('id'=>$domain['id']));
                                                        $this->db->update('domains');
                                                }
                                            }
                                    }
                                    break;
                            default:
                                    break;
                    }
    }


вот код гейта, сюда обращается главный скрипт:
в гейте голый php без FW

Код: Выделить всё

<?php
set_time_limit(80);
if($cp = count($_POST))
{
    $query = '';
    foreach($_POST as $key=>$value)
    {
        $cp--;
        if($cp>0)
            $query .= $key.'='.$value.'&';
        else
            $query .= $key.'='.$value;
    }
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //Don't verify ssl certificate
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);
    curl_setopt($ch, CURLOPT_TIMEOUT, 60);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Opera/9.80 (Windows NT 6.0; U; pl) Presto/2.10.229 Version/11.62');
    $url = "https://somedomain.net/xml.response";
    $request = $query;

    //echo $request;
    curl_setopt($ch, CURLOPT_URL, $url);

    curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
    $out = curl_exec($ch);
    curl_close($ch);
    echo $out;
    //print_r(json_decode($out,true));

}
else
    die('It\'s work');
?>


Kopilov писал(а):
30.05.2012 16:17
Сравните вывод phpinfo() при вызове из браузера и из cli. Возможно, используются разные php.ini (в Gentoo -- по умолчанию разные). Возможно попутное изменение конфигурации Web-сервером.
Возможно, причина в запуске от разных пользователей -- а это, скорее всего, так: apache (или под кем там сервер крутится) должен быть заблокирован для входа через терминал, а у пользователя, под которым вы входите, может не хватать прав.


спасибо, все это обязательно проверю, но стоит заметить, что запуск из cli прекрасно работает, т.е. запрос на третий сервер доходит, это точно! а вот ответ уже не возвращается.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5456
ОС: Gentoo

Re: [решено] выполнение скрипта php каждые 5 секунд

Сообщение /dev/random »

Попадает ли запись об ответе в лог? Если да, то есть ли отличия? Если нет, то есть ли доступ на запись к файлу лога при вызове в командной строке? Если доступ есть, добавьте вывод curl_errno() в лог или на экран при ошибке и приведите его здесь.
Спасибо сказали:
Аватара пользователя
kingpin
Сообщения: 5

Re: [решено] выполнение скрипта php каждые 5 секунд

Сообщение kingpin »

/dev/random писал(а):
30.05.2012 16:53
Попадает ли запись об ответе в лог? Если да, то есть ли отличия? Если нет, то есть ли доступ на запись к файлу лога при вызове в командной строке? Если доступ есть, добавьте вывод curl_errno() в лог или на экран при ошибке и приведите его здесь.


записи об ответе нет при вызове из ком.строки, доступ на файл лога есть, тк если не использовать гейт, то все работает и в логах есть все записи.
по поводу вывода ошибок curl:
делаю так

Код: Выделить всё

$out = curl_exec($ch);
write_file('/path/to/logs/cron_1.log', @date("d.m.Y h:i:s").' - err_curl : '.curl_errno($ch)."\r\n", "a+");


и в логах ничего нет, как-будто скрипт не проходит дальше выполнения curl_exec()
хотя должна быть хотябы строчка

Код: Выделить всё

30.05.2012 06:26:36 - err_curl :


опять же, если я из браузера выполняю главный скрипт, то есть и ответ от третьего сервера и эта строчка
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5456
ОС: Gentoo

Re: [решено] выполнение скрипта php каждые 5 секунд

Сообщение /dev/random »

Попробуйте увеличить значение опции max_execution_time в /etc/php/cli-php5.3/php.ini
Вообще, ЕМНИП, она должна игнорироваться в cli-версии, но вдруг я ошибаюсь? Очень похоже именно на неё.
Спасибо сказали:
Аватара пользователя
kingpin
Сообщения: 5

Re: [решено] выполнение скрипта php каждые 5 секунд

Сообщение kingpin »

/dev/random писал(а):
30.05.2012 20:43
Попробуйте увеличить значение опции max_execution_time в /etc/php/cli-php5.3/php.ini
Вообще, ЕМНИП, она должна игнорироваться в cli-версии, но вдруг я ошибаюсь? Очень похоже именно на неё.


ура, товарищи! все получилось, поставил
max_execution_time = 120
max_input_time = 120

били по 60 и ответы таки доходят)) я ликую

спасибо всем за помощь, особенно Вам, /dev/random
Спасибо сказали: