[11:47]
[🔒]
✪
Статья
Продвинутое использование cURL с PHP
Категории: Программир.; Интернет, сети, web;
// или
$lines = file("http://www.example.com");
readfile("http://www.example.com");
cUrl — мощный инструмент, который поддерживает множество протоколов и предоставляет полную информацию о запросе.
$ch = curl_init();
// 2. устанавливаем опции, включая урл
curl_setopt($ch, CURLOPT_URL, "http://www.google.com");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
// 3. выполнение запроса и получение ответа
$output = curl_exec($ch);
// 4. очистка ресурсов
curl_close($ch);
if ($output === FALSE) {
echo "cURL Error: " . curl_error($ch);
}
// ...
curl_exec($ch);
$info = curl_getinfo($ch);
echo 'Took ' . $info['total_time'] . ' seconds for url ' . $info['url'];
$urls = array(
"http://www.cnn.com",
"http://www.mozilla.com",
"http://www.facebook.com"
);
// браузеры
$browsers = array(
"standard" => array (
"user_agent" => "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 (.NET CLR 3.5.30729)",
"language" => "en-us,en;q=0.5"
),
"iphone" => array (
"user_agent" => "Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A537a Safari/419.3",
"language" => "en"
"french" => array (
"user_agent" => "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; GTB6; .NET CLR 2.0.50727)",
"language" => "fr,fr-FR;q=0.5"
)
foreach ($urls as $url) {
echo "URL: $url\n";
foreach ($browsers as $test_name => $browser) {
// установим адрес
curl_setopt($ch, CURLOPT_URL, $url);
// укажем используемый браузер и язык
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
"User-Agent: {$browser['user_agent']}",
"Accept-Language: {$browser['language']}"
));
// содержимое страницы нам не нужно
curl_setopt($ch, CURLOPT_NOBODY, 1);
// нужны только заголовки
curl_setopt($ch, CURLOPT_HEADER, 1);
// вернем результат, вместо его вывода
// определим перенаправления в HTTP заголовках?
if (preg_match("!Location: (.*)!", $output, $matches)) {
echo "$test_name: redirects to $matches[1]\n";
} else {
echo "$test_name: no redirection\n";
echo "\n\n";
standard: redirects to http://edition.cnn.com/
iphone: redirects to http://edition.cnn.com/
french: redirects to http://edition.cnn.com/
URL: http://www.mozilla.com
standard: redirects to https://www.mozilla.org/firefox/
iphone: redirects to https://www.mozilla.org/firefox/
french: redirects to https://www.mozilla.org/firefox/
URL: http://www.facebook.com
standard: redirects to https://www.facebook.com/
iphone: redirects to http://m.facebook.com/?refsrc=http%3A%2F%2Fwww.facebook.com%2F&_rdr
french: no redirection
$post_data = array (
"foo" => "bar",
"query" => "FooBar",
"action" => "Submit"
// делаем POST запрос
curl_setopt($ch, CURLOPT_POST, 1);
// добавляем данные
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
echo $output;
(
[foo] => bar
[query] => FooBar
[action] => Submit
// файл для загрузки
"upload" => "@/tmp/desert.jpg"
[upload] => Array
[name] => desert.jpg
[type] => application/octet-stream
[tmp_name] => /tmp/phpAhEvXy
[error] => 0
[size] => 845941
$ch1 = curl_init();
$ch2 = curl_init();
// устанавливаем опции
curl_setopt($ch1, CURLOPT_URL, "http://lxr.php.net/");
curl_setopt($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/");
curl_setopt($ch2, CURLOPT_HEADER, 0);
//create the multiple cURL handle
$mh = curl_multi_init();
// добавляем обработчики
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);
$running = null;
// выполняем запросы
do {
curl_multi_exec($mh, $running);
} while ($running > 0);
// освободим ресурсы
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);
$db_host = 'localhost';
$db_user = 'root';
$db_pass = '';
$db_name = 'wordpress';
$excluded_domains = array('localhost', 'easy-code.ru');
$max_connections = 10;
$url_list = array();
$working_urls = array();
$dead_urls = array();
$not_found_urls = array();
$active = null;
// соединимся с MySQL
if (!mysql_connect($db_host, $db_user, $db_pass)) {
die('Could not connect: ' . mysql_error());
if (!mysql_select_db($db_name)) {
die('Could not select db: ' . mysql_error());
// берем все посты со ссылками в тексте
$q = "SELECT post_content FROM wp_posts
WHERE post_content LIKE '%href=%'
AND post_status = 'publish'
AND post_type = 'post'";
$r = mysql_query($q) or die(mysql_error());
while ($d = mysql_fetch_assoc($r)) {
// собираем все ссылки с помощью регулярки
if (preg_match_all("/href=\"(.*?)\"/", $d['post_content'], $matches)) {
foreach ($matches[1] as $url) {
// фильтруем ненужные домены
$tmp = parse_url($url);
if (isset($tmp['host']) && in_array($tmp['host'], $excluded_domains)) {
continue;
// собираем вместе
$url_list [] = $url;
// удаляем повторения
$url_list = array_values(array_unique($url_list));
if (!$url_list) {
die('No URL to check');
// 1. добавим ссылки
for ($i = 0; $i < $max_connections; $i++) {
add_url_to_multi_handle($mh, $url_list);
// основной цикл
curl_multi_exec($mh, $curRunning);
// 2. один из потоков завершил работу
if ($curRunning != $running) {
$mhinfo = curl_multi_info_read($mh);
if (is_array($mhinfo) && ($ch = $mhinfo['handle'])) {
// 3. один из запросов выполнен, можно получить информацию о нем
// 4. нерабочая ссылка
if (!$info['http_code']) {
$dead_urls[] = $info['url'];
// 5. 404?
} else if ($info['http_code'] == 404) {
$not_found_urls[] = $info['url'];
// 6. верная ссылка
$working_urls[] = $info['url'];
// 7. удаляем отработавший дескриптор
curl_multi_remove_handle($mh, $mhinfo['handle']);
curl_close($mhinfo['handle']);
// 8. добавим новый урл
$running = $curRunning;
} while ($curRunning > 0);
echo "==Dead URLs==\n";
echo implode("\n", $dead_urls) . "\n\n";
echo "==404 URLs==\n";
echo implode("\n", $not_found_urls) . "\n\n";
echo "==Working URLs==\n";
echo implode("\n", $working_urls);
// 9. добавляет дескриптор с заданным урлом
function add_url_to_multi_handle($mh, $url_list) {
static $index = 0;
// если еще есть ссылки
if (isset($url_list[$index])) {
// все как обычно
curl_setopt($ch, CURLOPT_URL, $url_list[$index]);
// возвращаем, а не выводим результат
// разрешаем редиректы
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
// получаем только заголовки для экономии времени
// добавляем к мульти-дескриптору
curl_multi_add_handle($mh, $ch);
$index++;
xample1234.com/
==404 URLs==
www.google.com/dsfasdfafd
==Working URLs==
ru.php.net/manual/ru/function.time.php
www.cssbuttongenerator.com/
csslint.net/
codex.wordpress.org/Plugin_API/Action_Reference
fortawesome.github.io/Font-Awesome/
www.oracle.com/technetwork/java/javafx/downloads/index.html
codex.wordpress.org/Plugin_API/Filter_Reference
codex.wordpress.org/Roles_and_Capabilities
code.google.com/p/google-api-php-client/wiki/OAuth2#Google_APIs_Console
jplayer.org/
code.google.com/p/google-api-php-client/
developers.google.com/+/
accounts.google.com/ServiceLogin?service=devconsole&passive=1209600&continue=https%3A%2F%2Fcode.google.com%2Fapis%2Fconsole%2F&followup=https%3A%2F%2Fcode.google.com%2Fapis%2Fconsole%2F
daneden.github.io/animate.css/
github.com/daneden/animate.css
ru2.php.net/manual/ru/function.autoload.php
www.google.com/recaptcha/api/verify
phpunit.de/
phpunit.de/manual/current/en/phpunit-book.html
// отправляем имя и пароль
curl_setopt($ch, CURLOPT_USERPWD, "myusername:mypassword");
// если разрешить редиректы
// cURL отправит пароль и после перенапрвлений
curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1);
$file = fopen("/path/to/file", "r");
// урл уже содержит необходимые данные
$url = "ftp://username:password@mydomain.com:21/path/to/new/file";
// опции
curl_setopt($ch, CURLOPT_UPLOAD, 1);
curl_setopt($ch, CURLOPT_INFILE, $fp);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize("/path/to/file"));
curl_setopt($ch, CURLOPT_FTPASCII, 1);
curl_setopt($ch, CURLOPT_URL,'http://www.example.com');
// адрес прокси
curl_setopt($ch, CURLOPT_PROXY, '11.11.11.11:8080');
// если требуется авторизация
curl_setopt($ch, CURLOPT_PROXYUSERPWD,'user:pass');
curl_close ($ch);
curl_setopt($ch, CURLOPT_URL,'http://example.com');
curl_setopt($ch, CURLOPT_WRITEFUNCTION,"progress_function");
function progress_function($ch,$str) {
echo $str;
return strlen($str);
Чтобы написать комментарий нужно, зарегистрироваться
Голосования и тесты: 0