Загрузка данных XML без обновления

У меня есть сценарий, который получает некоторые значения из XML-записи.

Вот код:

<?php

//Data
$xml_data = '<image_process_call><image_url>https://i.pinimg.com/originals/e4/41/54/e44154308e3466d987665c6d50887f06.jpg</image_url><methods_list><method><name>collage</name><params>template_name=Nun Face in Hole;</params></method></methods_list><result_format>jpg</result_format><result_size>800</result_size><template_watermark>false</template_watermark></image_process_call>';

//Settings
$app_id = '';
$key = '';
$sign_data = hash_hmac('SHA1', $xml_data, $key);

//Send request
$request_url = 'http://opeapi.ws.pho.to/addtask?data='. $xml_data .'&sign_data='. $sign_data .'&app_id='. $app_id;
$request_xml = simplexml_load_file($request_url);
$request_id = strval($request_xml -> request_id);

if (isset($request_id)) {
    $result_url = 'http://opeapi.ws.pho.to/getresult?request_id='. $request_id;
    sleep(6);
    $result_xml = simplexml_load_file($result_url);
    $result_status = strval($result_xml -> status);
    $result_img = strval($result_xml -> result_url);
    if (isset($result_img)) {
        echo $result_img;
    } else {
        echo 'Result image not found';
    }
} else {
    echo 'Request ID not found';
}

?>

Проблема зависит от времени создания второго файла XML. $ result_xml занял несколько секунд, поэтому мне пришлось использовать функцию sleep (6). Если я удалю это, мне нужно будет обновить страницу (минимум три раза), чтобы получить ссылку на сгенерированное изображение из второго XML.

У вас есть идеи, как сделать это более профессионально? Я не могу быть уверен, что каждое изображение будет сгенерировано за 6 секунд (иногда короче, иногда дольше). Есть ли способ сгенерировать результат только после получения $ result_img? Заранее спасибо за помощь!

Думаю, стоит написать. На практике это выглядит так: Скрипт возвращает $ request_xml и XML с сайта:

<image_process_response>
<request_id>2d8d4dec-4344-4df0-a1e1-0c8df304ad11</request_id>
<status>OK</status>
<description/>
<err_code>0</err_code>
</image_process_response>

Скрипт получает request_id из этого XML и выполняет $ result_xml. Однако это XML, и скрипт не сразу получает URL-адрес изображения. Нужно подождать несколько секунд. После трехкратного обновления страницы или использования функции sleep (6), наконец, мы получаем:

<image_process_response>
<request_id>2d8d4dec-4344-4df0-a1e1-0c8df304ad11</request_id>
<status>OK</status>
<result_url>
http://worker-images.ws.pho.to/i1/9F1E2EAF-5B31-4407-8779-9A85F35862D3.jpg
</result_url>
<result_url_alt>
http://worker-images.ws.pho.to.s3.amazonaws.com/i1/9F1E2EAF-5B31-4407-8779-9A85F35862D3.jpg
</result_url_alt>
<limited_image_url>
http://worker-images.ws.pho.to/i1/3F797C83-2C2E-401C-B4AF-C4D36BBD442D.jpg
</limited_image_url>
<nowm_image_url>
http://worker-images.ws.pho.to/i1/9F1E2EAF-5B31-4407-8779-9A85F35862D3.jpg
</nowm_image_url>
<duration>2950.879097ms</duration>
<total_duration>2956.124067ms</total_duration>
</image_process_response>

Редактировать:

Попытавшись сразу сгенерировать изображение, я получаю такой XML:

<image_process_response>
<request_id>e615f0a1-ddee-4d81-94c4-a392f8f123e8</request_id>
<status>InProgress</status>
<description>The task is in progress, you need to wait for sometime.</description>
</image_process_response>

Вот почему я вижу пустую страницу ...

У кого-нибудь есть идея, как заставить скрипт повторно подключаться ко второму XML, пока он не найдет result_url?

Добавление sleep() между установкой строкового литерала и использованием этого литерала в вызове функции вообще не имеет смысла

RiggsFolly 26.10.2018 00:59

Почему вы используете $result_status = strval($result_xml -> status);, разумеется, простой $result_status = $result_xml -> status; - это все, что вам нужно

RiggsFolly 26.10.2018 01:04

@RiggsFolly К сожалению, мне все еще нужно обновлять страницу три-четыре раза, чтобы наконец получить изображение.

toch 26.10.2018 01:25

@RiggsFolly Я использовал strval, чтобы поместить в массив только строку.

toch 26.10.2018 01:31

Может быть, вам стоит заглянуть в руководство и узнать, что делает эта функция!

RiggsFolly 26.10.2018 01:33

@RiggsFolly Я думаю, что нужно заменить simplexml_load_file. Как еще я могу получить значение xml?

toch 26.10.2018 01:40
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
6
80
1

Ответы 1

The problem depends on time to generate the second XML file. $result_xml took few seconds so I have to use sleep(6) function. If I remove this, I need to refresh the page (minimum three times) to get a link to generated image from second XML.

Do you have an idea how to do it more professionally? I can't be sure that every image will be generated in 6 seconds (sometimes shorter sometimes longer). Is there any method for genereting the result only after receiving $result_img? Thanks in advance for your help!

Согласно Pho.to API, запрос на добавление задачи - это поставленный в очередь запрос POST.

На мой взгляд, отправить запрос в цикле while, но подождать меньшее время вместо фиксированных 6 секунд, проверить status в image_process_response, продолжать цикл до тех пор, пока он не станет InProgress, после этого вы можете безопасно отправить второй запрос, чтобы получить результат обработанного изображения .

Вы можете столкнуться с проблемой тайм-аута из-за низкой конфигурации тайм-аута для Защита от DoS, если вы запустите этот скрипт на веб-сервере (через CGI / FastCGI). Чтобы разрешить эту ситуацию, вам понадобится очередь для добавления задачи в ваш HTTP-запрос, а затем обработать ее в автономном режиме ( означает без веб-среды).

Другие вопросы по теме