У меня есть сценарий, который получает некоторые значения из 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?
Почему вы используете $result_status = strval($result_xml -> status);
, разумеется, простой $result_status = $result_xml -> status;
- это все, что вам нужно
@RiggsFolly К сожалению, мне все еще нужно обновлять страницу три-четыре раза, чтобы наконец получить изображение.
@RiggsFolly Я использовал strval, чтобы поместить в массив только строку.
Может быть, вам стоит заглянуть в руководство и узнать, что делает эта функция!
@RiggsFolly Я думаю, что нужно заменить simplexml_load_file. Как еще я могу получить значение xml?
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-запрос, а затем обработать ее в автономном режиме ( означает без веб-среды).
Добавление
sleep()
между установкой строкового литерала и использованием этого литерала в вызове функции вообще не имеет смысла