cURL のバージョン情報を取得します。 |
|
3. 実装プロセス
1. cURL セッションを初期化します
2. cURL セッションを実行します
4. cURL 情報および/またはエラー情報を取得します
5. cURL ハンドル
ここで最も複雑な部分はステップ 2 です。多くの cURL 設定オプションがあります。以下の例でそれについて学びます。
IV. 例1: GETリクエスト
GETリクエストの処理はcURLの一般的な処理です。
ローカル サーバー localserver.com のルート ディレクトリに、次の内容のテスト スクリプトindex.php を準備します。
<?php
$url = 'http://www.baidu.com';
// 初始化,获得一个cURL句柄
$ch = curl_init();
// 设置选项
curl_setopt($ch, CURLOPT_URL, $url); // 请求URL
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //返回数据流,而不直接输出
curl_setopt($ch, CURLOPT_HEADER, 0); // 无需响应的header头
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); //连接超时,秒为单位
// 执行并获取返回内容
$output = curl_exec($ch);
if($output === false){
$output = 'cURL error: ' . curl_error($ch);
}
// 释放 cURL 句柄资源
curl_close($ch);
print_r($output);
?>
ログイン後にコピー
ブラウザはローカル サーバーのホームページ localserver.com/index.php にアクセスし、Baidu のホームページを表示します。
5. 例 2. POST リクエスト
POST リクエストでは 2 つのオプションを設定する必要があります:
curl_setopt($ch, CURLOPT_POST, 1); // 表明POST请求
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData)); // POST提交数据
ログイン後にコピー
まず、リモート サーバー (remoteserver.com) のルート ディレクトリで受信するためのスクリプト Index.php を、次の内容で準備します。
<?php
$input = file_get_contents('php://input');
echo $input;
?>
ログイン後にコピー
次に、ローカル サーバー localserver.com のルート ディレクトリを使用して、POST リクエストに使用されるスクリプトindex.php を記述します。内容は次のとおりです。
<?php
$url = 'http://remoteserver.com/index.php';
$data = array(
'fname'=> 'Daniel',
'lname' => 'Stenberg'
);
// 初始化
$ch = curl_init();
// 设置选项
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_POST, 1); // POST请求
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); //POST数据。用http_build_query()转换为“&”拼接的字符串
// 执行并获取返回内容
$output = curl_exec($ch);
if($output === false){
$output = 'cURL error: ' . curl_error($ch);
}
// 释放 cURL 句柄资源
curl_close($ch);
print_r($output);
?>
ログイン後にコピー
ブラウザが localserver.com/index.php にアクセスすると、表示は以下の通りです:
fname=Daniel&lname=Stenberg
ログイン後にコピー
6. 例3. ファイルをアップロードする
cURLでファイルをアップロードする考え方は、ファイルパスの前に「@」記号を追加し、アップロードするリクエストフィールドに設置することです。バックグラウンドは、$_FILES を通じてアップロードされたファイル情報を取得できます。ただし、PHP5.6以降は「@」記号が廃止され、CURLFileクラスを利用してアップロードを実装できるようになりました。
まずリモートサーバーremoteserver.comのルートディレクトリに受信スクリプトindex.phpを用意し、内容は以下の通りです:
<?php
$action = $_POST['action'];
if($action == 'uploadImage'){
$name = $_FILES['file']['name'];
$tmpname = $_FILES['file']['tmp_name'];
// 保存到当前脚本所在目录
move_uploaded_file($tmpname, dirname(__FILE__).'/'.$name);
$error = $_FILES['file']['error'];
switch ($error) {
case 0: echo '上传成功'; break;
case 1: echo '文件大小超出 php.ini 限制'; break;
case 2: echo '文件大小超出 表单 MAX_FILE_SIZE 限制'; break;
case 3: echo '文件部分被上传'; break;
case 4: echo '没有文件被上传'; break;
case 6: echo '找不到临时文件夹'; break;
case 7: echo '文件写入失败'; break;
default: $output = '未知错误';
}
}
?>
ログイン後にコピー
次に画像ファイルtest.jpgとcURLアップロードスクリプトインデックスをリモートサーバーのルートディレクトリに用意します。ローカルサーバー localserver.com.php のスクリプトの内容は次のとおりです:
<?php
$url = 'http://remoteserver.com/index.php';
$file = realpath(getcwd() . '/test.jpg');
$data = array(
'action' => 'uploadImage',
'file' => '@' . $file
);
if(version_compare(PHP_VERSION, '5.6.0') > 0){
$data['file'] = new CURLFile($file);
}
// 初始化
$ch = curl_init();
// 设置选项
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
// 执行并获取返回内容
$output = curl_exec($ch);
if($output === false){
$output = 'cURL error: ' . curl_error($ch);
}
// 释放 cURL 句柄资源
curl_close($ch);
print_r($output);
?>
ログイン後にコピー
ブラウザは localserver.com/index.php にアクセスし、表示は次のようになります:
リモート サーバーのルート ディレクトリを確認すると、追加の写真がアップロードされました。
VII. 例 4. ファイルをダウンロードする
cURL を使用してファイルをダウンロードするための 1 つのアイデアは、cURL オプション CURLOPT_FILE をファイル ポインターとして設定し、要求されたリソース ファイルをファイル ストリームに関連付けることです。このファイル ストリームは通常 fopen() です。関数の値。ファイル ストリームを使用してリモート ファイルをローカルに書き込むと、大きなファイルを書き込む (ダウンロードする) ときに発生する可能性のあるメモリ エラーを回避できます。
ローカルサーバーlocalserver.comのルートディレクトリにテストスクリプトindex.phpを書きます 内容は以下の通りです:
<?php
$url = 'http://remoteserver.com/test.jpg';
$file = './test.jpg';
$fp = fopen($file, 'w');
// 初始化
$ch = curl_init();
// 设置选项
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_FILE, $fp); // 用于传输的文件流,默认是STDOUT
// 执行并获取返回内容
$output = curl_exec($ch);
if($output === false){
$output = 'cURL error: ' . curl_error($ch);
}
// 获取已下载大小
$size_download = curl_getinfo($ch, CURLINFO_SIZE_DOWNLOAD);
// 释放资源
fclose($fp);
curl_close($ch);
if ($size_download && $size_download == filesize($file)) {
echo "下载成功";
} else {
echo "下载失败或不完整";
}
?>
ログイン後にコピー
ブラウザはlocalserver.com/index.phpにアクセスし、表示は以下のようになります:
ローカル サーバーのルート ディレクトリを確認すると、リモート画像がダウンロードされていることがわかります。
8. バッチ処理
cURL にはバッチ ハンドルがあり、これは複数の cURL ハンドルを開き、これらのハンドルをバッチ ハンドルにバインドし、各 cURL 接続をループで順番に処理することで実現できます。 、「マルチスレッド」に似ています。
ローカルサーバーlocalserver.comのルートディレクトリにテストスクリプトindex.phpを書きます 内容は以下の通りです:
<?php
$urls = array(
'http://www.baidu.com',
'http://www.qidian.com'
);
$count = count($urls);
$ch = array();
// 创建批处理cURL句柄
$mh = curl_multi_init();
// 初始化每个cURL,并设置选项,绑定给批处理句柄
for ($i = 0; $i < $count; $i++) {
$ch[$i] = curl_init();
curl_setopt($ch[$i], CURLOPT_URL, $urls[$i]);
curl_setopt($ch[$i], CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch[$i], CURLOPT_HEADER, 0);
curl_setopt($ch[$i], CURLOPT_CONNECTTIMEOUT, 30);
curl_multi_add_handle($mh, $ch[$i]);
}
// 执行批处理
$running = null;
do {
usleep(10000); // 延迟0.01秒,单位为百万分之一秒
curl_multi_exec($mh, $running); // 异步实现批处理,类似“多线程”
} while($running > 0);
// 获取每个cURL的响应
$res = array();
for ($i = 0; $i < $count; $i++) {
$res[$i] = curl_multi_getcontent($ch[$i]);
}
// 关闭全部句柄
for ($i = 0; $i < $count; $i++) {
curl_multi_remove_handle($mh, $ch[$i]);
}
curl_multi_close($mh);
print_r($res);
?>
ログイン後にコピー
ブラウザはlocalserver.com/index.phpにアクセスし、「接続済み」のBaiduホームページとQidianを表示します。 .comのホームページ。