curl отправить в php-файл с включенной функцией sleep()

Я хочу отправить электронное письмо с автоматическим содержимым из сценария входа, но оно должно быть отправлено с задержкой в ​​несколько (рандомизированных) секунд (для отправки одной части пары ключей).

Вот почему я пытался использовать curl, который обычно работает, вместо использования «include» или класса, но основной скрипт не должен ждать, пока завершится sleep().

основной код (простой код завитка), играющий с «CURLOPT_MUTE, 1» и «CURLOPT_RETURNTRANSFER, false», вообще не работал.


    <?php
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,"http://domain/path/to/delayed_mail.php");
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS,
        'to=' . $to . '&from=' . $from . '&subject=...');
    curl_exec ($ch);
    curl_close ($ch);
    ?>

delayed_mail.php выглядит примерно так


    <?php
    //path to mail class
    //some POST and GET REQUEST filters and authentications
    //with      $_REQ[$key]=$value;   as output

    $delay = rand(2,32);
    sleep($delay);
    $ddlab->mail->html($_REQ['to'],$_REQ['from'],...,$_REQ['options']);
    ?>

Как я уже говорил выше, я немного застрял. Основной скрипт, предназначенный для вывода html, не должен ждать отправки электронной почты после sleep().

1-й вопрос: Как «delayed_mail.php» может выполняться независимо (отправляйте электронную почту, когда захотите, но оставьте мой скрипт работающим!)

2-й вопрос: Как я могу установить внутренний путь, например «../../delayed_mail.php» или getcwd().’/delayed_mail.php’ (которые оба не работают) вместо полного «http:/ /"-URL ?

Спасибо за ваши старания.


person ddlab    schedule 29.11.2013    source источник
comment
Мои вопросы могут включать: Есть ли другой способ вместо использования завитка достичь того же результата, что и описанный?   -  person ddlab    schedule 30.11.2013


Ответы (2)


curl не рассчитывается по тайм-ауту php, эта средняя команда curl может работать вечно, чтобы получить ответ, но вы можете ограничить ее с помощью внутренних параметров curl с этой информацией, ваш скрипт должен работать с обычной командой php sleep !!

$delay = rand(2,32);
    sleep($delay);

сделает случайную задержку между 2 или 32 секундами

2-с завитком лучше использовать полный путь, как вы установили!

http://domain/path/to/delayed_mail.php

curl работает с этим URL-адресом так же, как вы набрали его в своем браузере!

person peiman F.    schedule 29.11.2013
comment
рандомизированная задержка... это нормально и то, что я хочу. Я знаю, что могу установить фиксированную задержку, используя sleep(7). Это не часть проблем :-) - person ddlab; 30.11.2013

ДА, я хочу ответить на свой вопрос :-)

Решение состоит в том, чтобы вообще НЕ использовать curl :-), благодаря сообщению Мартина Лейкса на http://php.net/manual/en/function.exec.php Я использовал команду Linux. Для серверов на базе Windows это должно выглядеть иначе, но здесь не хватает места ;-)


    <?php
    passthru("
        /usr/bin/php
        /home/www/path/to/delayed_mail.php
        " . $params . "
        >
        /home/www/path/to/delayed_mail.log
        2>&1
        &
        ");
    ?>

что объясняется здесь:


    <?php
    passthru("
        linux_php_call
        executed_file
        transferred_parameters
        linux_command_for_output 
        output_file
        linux_commands
        ampersand_at_the_end_for_silent_mode
        ");
    ?>

(Все параметры в очереди с пробелом)

Просто поместите все необходимые параметры в $params, например как массив(), вы получите его как ключ $argv, который тоже является массивом(), и вот вы здесь.

person ddlab    schedule 30.11.2013