Запросите скрипт PHP из другого скрипта и двигайтесь дальше - PullRequest
1 голос
/ 10 ноября 2011

Я создаю форум, который позволит пользователям загружать изображения.Изображения будут временно храниться на моем веб-сервере (чтобы я мог загрузить их с помощью индикатора выполнения), прежде чем они будут перемещены в корзину S3.Я не нашел блестящего способа сделать это, но я думаю, что имеет смысл следующее:

  1. Загрузка изображений на веб-сервер с использованием XHR с индикатором выполнения
  2. Подождите, пока пользователь не отправит свое сообщение
  3. Отмените связь с изображениями, которые он не включил в свой пост
  4. Вызовите URL, который загружает оставшиеся изображения на S3 (и обновите URL-адреса изображений в теле сообщения, когда это будет сделано)
  5. Перенаправьте пользователя на его сообщение в теме

Теперь, поскольку шаг 4 может занять значительное количество времени, яищу решение, подобное cron, где я могу вызвать скрипт загрузки S3 в фоновом режиме и не дать пользователю дождаться его завершения.

В идеале я ищу решение, которое позволяет мнезапросите URL в моей структуре и передайте некоторые идентификаторы изображений в запросе, например:

http://mysite.com/utils/move-to-s3/?images=1,2,3

Могу ли я использовать cURL для этой цели?Или, если это должен быть exec (), могу ли я по-прежнему выполнять URL (wget?) Вместо сценария PHP (php-cli)?

Спасибо, куча!

Ответы [ 3 ]

1 голос
/ 10 ноября 2011

PHP

  register_shutdown_function()

твой друг [ссылка] .

Функция выключения продолжает работать, пока ваш скрипт завершен.

Таким образом, если все доступно, отправьте страницу финала и exit. Зарегистрированная функция выключения продолжается и выполняет трудоемкое задание.

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

0 голосов
/ 14 ноября 2011

Я нашел решение этой проблемы, которым я с удовольствием поделюсь.Я на самом деле нашел его на SO, но это нужно немного настроить.Здесь идет:

  1. Для решения требуется либо exec(), либо shell_exec().Неважно, какой вы используете, так как все выходные данные будут отброшены в любом случае.Я выбрал exec().

  2. Поскольку я использую MAMP, а не установку PHP на системном уровне, мне нужно было указать на двоичный файл PHP внутри пакета MAMP.(Это действительно имело значение.) Я решил определить этот путь в константе с именем PHP_BIN, чтобы я мог установить другой путь для локальной и рабочей среды.В этом случае:

    define(PHP_BIN, '/Applications/MAMP/bin/php/php5.3.6/bin/php');

  3. В идеале я хотел выполнить сценарий внутри своей веб-инфраструктуры вместо какого-то изолированного сценария оболочки.Я написал скрипт-обертку, который принимает URL в качестве аргумента, и назвал его my_curl.php:

    if(isset($argv[1]))
    {
        $url = $argv[1];
    
        if(preg_match('/^http(s)?:\/\//', $url))
        {
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_HEADER, 0);
            curl_exec($ch);
            curl_close($ch);
        }
    }
    
  4. В этот вопрос SO Я нашел способ выполнитькоманда оболочки в фоновом режиме.Это необходимо, потому что я не хочу, чтобы пользователь ждал, пока он закончит.

  5. Наконец, я запускаю этот бит кода PHP для выполнения другого (или ЛЮБОГО) веб-запросана заднем плане:

    exec(PHP_BIN . ' /path/to/my_curl.php http://site.com/url/to/request
    &> /dev/null &');
    

Работает как шарм!Надеюсь, это поможет.

0 голосов
/ 10 ноября 2011

Попробуйте следующее утверждение:

shell_exec(php scriptname);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...