安全存档guzzle响应

时间:2016-01-25 14:43:36

标签: php guzzle

我正在尝试使用一系列图片网址并使用guzzle来获取它们并将它们添加到ZipArchive。我过去做过非常少量的异步意识编码,并且不确定如何在php中最好地处理这个问题。

这是我到目前为止所做的:

<?php

$requests = [];
foreach ($urls as $url) {
    $requests[] = new \GuzzleHttp\Psr7\Request('GET', $url);
};

$zip = new ZipArchive();

$client = new \GuzzleHttp\Client();

$pool = new \GuzzleHttp\Pool($client, $requests, [
   'concurrency' => 5,
    'fulfilled' => function ($response) use ($zip) {
        $id = \Rhumsaa\Uuid\Uuid::uuid4()->toString();
        $zip->addFromString($id, (string)$response->getBody());
    },
    'rejected' => function ($reason, $index) {
         // no-op
    }
]);

$pool->promise()->wait();

$zip->close();

因为这些请求会同时发送,我是否需要以某种方式锁定/解锁$zip回调中对fulfilled的访问权限?如果是这样,怎么样?

奖金(无关)问题:如果不在网址中,从$response获取所提取图像的适当扩展,最佳方法是什么?有没有比检查内容类型和使用地图更清洁的方法?例如:

$extensions = [
    'image/png' => '.png',
    'image/jpeg' => '.jpeg',
    'image/gif' => '.gif',
    // etc
];

1 个答案:

答案 0 :(得分:1)

  

我是否需要在已完成的回调中以某种方式锁定/解锁对$ zip的访问权限?

不,你没有。承诺是异步解决的,当然,但它都在一个线程中。当你这样做时:

$zip->addFromString($id, (string)$response->getBody());

你在这里阻止php,直到文件被添加到ZIP存档。

  

如果不在网址中,从$ response获取相应扩展图片的最佳方法是什么?

我认为检查Content-Type是正确的方法。你可以这样做:

$contentType = explode(';', $response->getHeaderLine('Content-Type'), 2)[0];
$extensions = [
    'image/png' => '.png',
    'image/jpeg' => '.jpeg',
    'image/gif' => '.gif',
    // etc
];

// check for $extensions[$contentType];