基于PHP实现七牛抓取远程图片的攻略如下:
一、安装七牛SDK
要使用PHP代码操作七牛云存储,需要先安装相关SDK,在这里我们使用qiniu/php-sdk这个官方提供的SDK,使用composer安装即可。
composer require qiniu/php-sdk
二、申请AK/SK
申请过程不细讲,可以参考七牛云文档。
三、编写代码
实现流程
- 获取远程图片URL和要存储到的七牛bucket和key
- 获取远程图片内容
- 创建一个七牛服务对象
- 上传图片到七牛
以下是基于魔术方法的一个示例实现:
<?php
require_once __DIR__ . '/vendor/autoload.php';
# AK&SK
$accessKey = '<Your Access Key>';
$secretKey = '<Your Secret Key>';
# 要抓取的远程文件 URL
$fileUrl = 'http://www.example.com/remote.jpg';
# 存储到七牛后的文件名及路径
$key = 'my-prefix/some/path/file-name.jpg';
# 七牛配置
$config = new \Qiniu\Config();
$config->useHTTPS = true;
# 构建七牛服务对象
$qiniu = new \Qiniu\Storage\UploadManager($config);
# 抓取远程文件
list($fileContents) = \Qiniu\Utils\HttpManager::requestWithoutAuth($fileUrl);
# 上传到七牛存储
list($ret, $err) = $qiniu->put($token, $key, $fileContents);
if ($err !== null) {
echo sprintf("qiniu-sdk error: %s\n", $err->getMessage());
} else {
echo sprintf("success: http://%s/%s\n", $config->getUpHost(), $ret['key']);
}
如何使用
在上面的代码示例中,需要填写七牛AK和SK,$fileUrl表示要抓取的远程图片URL,$key是上传到七牛的文件名及路径。其余的代码无需修改,直接运行即可实现抓取远程图片并上传到七牛。
四、优化实现
实际上,上面的文件上传代码还是有问题的,因为抓取远程图片的过程可能会比较耗时,这会导致后面的文件上传操作可能会出现超时等问题。一个更好的解决方案是使用PHP协程进行异步编程,代码如下:
<?php
require_once __DIR__ . '/vendor/autoload.php';
use GuzzleHttp\Client;
use function GuzzleHttp\Promise\coroutine;
# AK&SK
$accessKey = '<Your Access Key>';
$secretKey = '<Your Secret Key>';
# 要抓取的远程文件 URL
$fileUrl = 'http://www.example.com/remote.jpg';
# 存储到七牛后的文件名及路径
$key = 'my-prefix/some/path/file-name.jpg';
# 七牛配置
$config = new \Qiniu\Config();
$config->useHTTPS = true;
# 构建七牛服务对象
$qiniu = new \Qiniu\Storage\UploadManager($config);
# GuzzleHttp 请求客户端
$httpClient = new Client();
coroutine(function () use ($qiniu, $httpClient, $fileUrl, $key) {
# 抓取远程文件
$downloadPromise = $httpClient->getAsync($fileUrl)->then(function ($response) {
return $response->getBody()->getContents();
});
# 存储到七牛
$uploadPromise = $downloadPromise->then(function ($fileContents) use ($qiniu, $key) {
list($ret, $err) = $qiniu->put(null, $key, $fileContents);
if ($err !== null) {
echo sprintf("qiniu-sdk error: %s\n", $err->getMessage());
} else {
echo sprintf("success: http://%s/%s\n", $config->getUpHost(), $ret['key']);
}
});
yield $uploadPromise;
});
以上示例代码中,将抓取远程文件和上传到七牛存储的过程异步执行,这样不会阻塞其他操作,文件上传操作也不存在超时等问题。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于php实现七牛抓取远程图片 - Python技术站