Колекция от съвети и факти за оптимизиране на PHP скриптове. Обратни повиквания

cURL е специален инструмент, предназначен за прехвърляне на файлове и данни, използвайки URL синтаксиса. Тази технология поддържа много протоколи като HTTP, FTP, TELNET и много други. cURL първоначално е проектиран да бъде инструмент за команден ред. За наш късмет библиотеката cURL се поддържа от езика за програмиране PHP. В тази статия ще разгледаме някои от разширените функции на cURL, както и ще се докоснем до практическото приложение на придобитите знания с помощта на PHP.

Защо cURL?

Всъщност има доста алтернативни начини за извличане на съдържанието на уеб страница. В много случаи, най-вече от мързел, използвах прости PHP функции вместо cURL:

$съдържание = file_get_contents("http://www.nettuts.com"); // или $lines = file("http://www.nettuts.com"); // или readfile("http://www.nettuts.com");

Тези функции обаче практически нямат гъвкавост и съдържат огромен брой недостатъци по отношение на обработката на грешки и т.н. Освен това има определени задачи, които просто не можете да решите с тези стандартни функции: взаимодействие с бисквитки, удостоверяване, изпращане на формуляр, качване на файлове и т.н.

cURL е мощна библиотека, която поддържа много различни протоколи, опции и предоставя подробна информация за URL заявките.

Основна структура

  • Инициализация
  • Задаване на параметри
  • Изпълнение и извличане на резултата
  • Освобождаване на памет

// 1. инициализация $ch = curl_init(); // 2. задайте параметри, включително url curl_setopt($ch, CURLOPT_URL, "http://www.nettuts.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); // 3. вземете HTML като резултат $output = curl_exec($ch); // 4. затваряне на връзката curl_close($ch);

Стъпка #2 (т.е. извикването на curl_setopt()) ще бъде обсъдена в тази статия много повече от всички останали стъпки, защото. на този етап се случват всички най-интересни и полезни неща, които трябва да знаете. Има огромен брой различни опции в cURL, които трябва да бъдат посочени, за да можете да конфигурирате URL заявка по най-задълбочения начин. Няма да разглеждаме целия списък като цяло, а ще се съсредоточим само върху това, което смятам за необходимо и полезно за този урок. Всичко останало можете да проучите сами, ако тази тема ви интересува.

Проверка на грешки

Освен това можете също да използвате условни изрази, за да проверите дали дадена операция е успешна:

// ... $изход = curl_exec($ch); if ($output === FALSE) ( echo "cURL Грешка: " . curl_error($ch); ) // ...

Тук ви моля да отбележите една много важна точка за себе си: трябва да използваме „=== false“ за сравнение, вместо „== false“. За тези, които не са запознати, това ще ни помогне да направим разлика между празен резултат и фалшива булева стойност, което ще покаже грешка.

Получаване на информацията

Друга допълнителна стъпка е да получите данни за cURL заявката, след като е била изпълнена.

// ... curl_exec($ch); $info = curl_getinfo($ch); echo "Взе" . $info["общо_време"] . " секунди за url " . $info["url"]; // ...

Върнатият масив съдържа следната информация:

  • "url"
  • "тип съдържание"
  • http_code
  • „header_size“
  • "request_size"
  • „файлово време“
  • „ssl_verify_result“
  • „redirect_count“
  • "общо време"
  • „namelookup_time“
  • „време за свързване“
  • "време_предпрехвърляне"
  • "size_upload"
  • размер_изтегляне
  • „скорост_изтегляне“
  • “speed_upload”
  • "дължина_на_съдържание за изтегляне"
  • „upload_content_length“
  • "начален_час на прехвърляне"
  • "време_на_пренасочване"

Откриване на пренасочване в зависимост от браузъра

В този първи пример ще напишем код, който може да открие URL пренасочвания въз основа на различни настройки на браузъра. Например, някои уебсайтове пренасочват браузърите на мобилен телефон или друго устройство.

Ще използваме опцията CURLOPT_HTTPHEADER, за да определим нашите изходящи HTTP заглавки, включително името на браузъра на потребителя и наличните езици. В крайна сметка ще можем да определим кои сайтове ни пренасочват към различни URL адреси.

// тест 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" => масив ("user_agent" => "Mozilla/5.0 (iPhone; U ; CPU като Mac OS X; en) AppleWebKit/420+ (KHTML, като Gecko) Version/3.0 Mobile/1A537a Safari/419.3", "language" => "en"), "french" => array ("user_agent" => "Mozilla/4.0 (съвместим; MSIE 7.0; Windows NT 5.1; GTB6; .NET CLR 2.0.50727)", "език" => "fr,fr-FR;q=0.5")); foreach ($urls като $url) ( echo "URL: $url\n"; foreach ($browsers като $test_name => $browser) ( $ch = curl_init(); // посочете url curl_setopt($ch, CURLOPT_URL, $url); // задаване на заглавки на браузър curl_setopt($ch, CURLOPT_HTTPHEADER, array("Потребителски агент: ($browser["user_agent"])", "Приемане на език: ($browser["език"])" ) ); // нямаме нужда от съдържание на страница curl_setopt($ch, CURLOPT_NOBODY, 1); // трябва да получим HTTP заглавки curl_setopt($ch, CURLOPT_HEADER, 1); // връщане на резултати вместо изход curl_setopt($ch , CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($ch); curl_close($ch); // Имаше ли HTTP пренасочване? if (preg_match("!Location: (.*)!", $output, $matches) ) ( echo " $test_name: пренасочва към $matches\n"; ) else ( echo "$test_name: без пренасочване\n"; ) ) echo "\n\n"; )

Първо, ние определяме списък с URL адреси на сайтове, които ще проверяваме. По-точно, трябват ни адресите на тези сайтове. След това трябва да дефинираме настройките на браузъра, за да тестваме всеки от тези URL адреси. След това ще използваме цикъл, в който ще прегледаме всички получени резултати.

Трикът, който използваме в този пример, за да зададем настройките на cURL, ще ни позволи да получим не съдържанието на страницата, а само HTTP заглавките (съхранени в $output). След това, използвайки прост регулярен израз, можем да определим дали низът „Location:“ присъства в получените заглавки.

Когато стартирате този код, трябва да получите нещо подобно:

Извършване на POST заявка към конкретен URL адрес

При формиране на GET заявка, предадените данни могат да бъдат предадени на URL чрез „низ за заявка“. Например, когато търсите в Google, думата за търсене се поставя в адресната лента на новия URL адрес:

http://www.google.com/search?q=ruseller

Не е необходимо да използвате cURL, за да симулирате тази заявка. Ако мързелът най-накрая ви победи, използвайте функцията „file_get_contents ()“, за да получите резултата.

Но работата е там, че някои HTML форми изпращат POST заявки. Данните от тези форми се транспортират през тялото на HTTP заявката, а не както в предишния случай. Например, ако сте попълнили формуляр във форум и сте кликнали върху бутона за търсене, най-вероятно ще бъде направена POST заявка:

http://codeigniter.com/forums/do_search/

Можем да напишем PHP скрипт, който може да симулира този вид URL заявка. Първо, нека създадем прост файл за приемане и показване на POST данни. Нека го наречем post_output.php:

Print_r($_POST);

След това създаваме PHP скрипт за изпълнение на cURL заявката:

$url = "http://localhost/post_output.php"; $post_data = array("foo" => "bar", "query" => "Nettuts", "action" => "Submit"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // показваме, че имаме POST заявка curl_setopt($ch, CURLOPT_POST, 1); // добавяне на променливи curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); $изход = curl_exec($ch); curl_close($ch); ехо $ изход;

Когато стартирате този скрипт, трябва да получите подобен резултат:

Така POST заявката беше изпратена до скрипта post_output.php, който от своя страна изведе суперглобалния масив $_POST, чието съдържание получихме с помощта на cURL.

Качване на файл

Първо, нека създадем файл, за да го формираме и да го изпратим във файла upload_output.php:

Print_r($_FILES);

И ето кода на скрипта, който изпълнява горната функционалност:

$url = "http://localhost/upload_output.php"; $post_data = масив ("foo" => "bar", // файл за качване "upload" => "@C:/wamp/www/test.zip"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); $изход = curl_exec($ch); curl_close($ch); ехо $ изход;

Когато искате да качите файл, всичко, което трябва да направите, е да го предадете като обикновена пост променлива, предшествана от символа @. Когато стартирате писмения скрипт, ще получите следния резултат:

Множество cURL

Една от най-силните страни на cURL е възможността за създаване на "множество" манипулатори на cURL. Това ви позволява да отворите връзка към множество URL адреси едновременно и асинхронно.

В класическата версия на cURL заявката изпълнението на скрипта е спряно и се очаква да завърши операцията по URL заявка, след което скриптът може да продължи. Ако възнамерявате да взаимодействате с много URL адреси, това ще ви отнеме доста време, тъй като в класическия случай можете да работите само с един URL наведнъж. Въпреки това можем да коригираме тази ситуация, като използваме специални манипулатори.

Нека да разгледаме примерния код, който взех от php.net:

// създаване на някои cURL ресурси $ch1 = curl_init(); $ch2 = curl_init(); // посочете URL и други параметри 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); //създаване на манипулатор на множество cURL $mh = curl_multi_init(); //добавяне на множество манипулатори curl_multi_add_handle($mh,$ch1); curl_multi_add_handle($mh,$ch2); $активно = нула; //изпълнение do ( $mrc ​​​​= curl_multi_exec($mh, $active); ) докато ($mrc == CURLM_CALL_MULTI_PERFORM); while ($active && $mrc ​​​​== CURLM_OK) ( if (curl_multi_select($mh) != -1) ( do ( $mrc ​​​​= curl_multi_exec($mh, $active); ) while ($mrc == CURLM_CALL_MULTI_PERFORM); ) ) //затваряне curl_multi_remove_handle($mh, $ch1); curl_multi_remove_handle($mh, $ch2); curl_multi_close($mh);

Идеята е, че можете да използвате множество манипулатори на cURL. С помощта на прост цикъл можете да следите кои заявки все още не са изпълнени.

В този пример има два основни цикъла. Първият do-while цикъл извиква функцията curl_multi_exec(). Тази функция не блокира. Той се изпълнява възможно най-бързо и връща състоянието на заявката. Въпреки че върнатата стойност е константата 'CURLM_CALL_MULTI_PERFORM', това означава, че работата все още не е завършена (например в момента се изпращат http заглавки в URL); Ето защо ние продължаваме да проверяваме тази върната стойност, докато не получим различен резултат.

В следващия цикъл проверяваме условието, докато $active = "true". Това е вторият параметър към функцията curl_multi_exec(). Стойността на тази променлива ще бъде "истина", докато някоя от съществуващите промени е активна. След това извикваме функцията curl_multi_select(). Изпълнението му "блокира", докато има поне една активна връзка, докато не се получи отговор. Когато това се случи, ние се връщаме към основния цикъл, за да продължим да изпълняваме заявки.

А сега нека приложим наученото с пример, който ще бъде наистина полезен за голям брой хора.

Проверка на връзки в WordPress

Представете си блог с огромен брой публикации и съобщения, всяко от които има връзки към външни интернет ресурси. Някои от тези връзки може вече да са „мъртви“ по различни причини. Може би страницата е изтрита или сайтът изобщо не работи.

Ще създадем скрипт, който ще анализира всички връзки и ще намери уебсайтове, които не се зареждат, и 404 страници, след което ще ни предостави много подробен отчет.

Веднага ще кажа, че това не е пример за създаване на плъгин за WordPress. Това е почти всичко добра тестова площадка за нас.

Нека най-накрая да започнем. Първо трябва да извлечем всички връзки от базата данни:

// конфигурация $db_host = "localhost"; $db_user = "root"; $db_pass = ""; $db_name = "wordpress"; $excluded_domains = array("localhost", "www.mydomain.com"); $max_connections = 10; // инициализация на променлива $url_list = array(); $working_urls = масив(); $dead_urls = масив(); $not_found_urls = масив(); $активно = нула; // свързване с MySQL if (!mysql_connect($db_host, $db_user, $db_pass)) ( die("Не може да се свърже: " . mysql_error()); ) if (!mysql_select_db($db_name)) ( die("Може 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) или die(mysql_error()); while ($d = mysql_fetch_assoc($r)) ( // извличане на връзки с помощта на регулярни изрази if (preg_match_all("!href=\"(.*?)\"!", $d["post_content"], $ съвпадения) / / премахване на дубликати $url_list = array_values(array_unique($url_list)); if (!$url_list) ( die("Няма URL за проверка"); )

Първо генерираме конфигурационни данни за взаимодействие с базата данни, след което пишем списък с домейни, които няма да участват в проверката ($excluded_domains). Ние също така дефинираме число, което характеризира броя на максималните едновременни връзки, които ще използваме в нашия скрипт ($max_connections). След това се присъединяваме към базата данни, избираме публикациите, които съдържат връзки, и ги събираме в масив ($url_list).

Следният код е малко сложен, така че го разберете от началото до края:

// 1. множествен манипулатор $mh = curl_multi_init(); // 2. добавете много URL адреси за ($i = 0; $i< $max_connections; $i++) { add_url_to_multi_handle($mh, $url_list); } // 3. инициализация выполнения do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); // 4. основной цикл while ($active && $mrc == CURLM_OK) { // 5. если всё прошло успешно if (curl_multi_select($mh) != -1) { // 6. делаем дело do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); // 7. если есть инфа? if ($mhinfo = curl_multi_info_read($mh)) { // это значит, что запрос завершился // 8. извлекаем инфу $chinfo = curl_getinfo($mhinfo["handle"]); // 9. мёртвая ссылка? if (!$chinfo["http_code"]) { $dead_urls = $chinfo["url"]; // 10. 404? } else if ($chinfo["http_code"] == 404) { $not_found_urls = $chinfo["url"]; // 11. рабочая } else { $working_urls = $chinfo["url"]; } // 12. чистим за собой curl_multi_remove_handle($mh, $mhinfo["handle"]); // в случае зацикливания, закомментируйте данный вызов curl_close($mhinfo["handle"]); // 13. добавляем новый url и продолжаем работу if (add_url_to_multi_handle($mh, $url_list)) { do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); } } } } // 14. завершение curl_multi_close($mh); 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); function add_url_to_multi_handle($mh, $url_list) { static $index = 0; // если у нас есть ещё url, которые нужно достать if ($url_list[$index]) { // новый curl обработчик $ch = curl_init(); // указываем url curl_setopt($ch, CURLOPT_URL, $url_list[$index]); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_NOBODY, 1); curl_multi_add_handle($mh, $ch); // переходим на следующий url $index++; return true; } else { // добавление новых URL завершено return false; } }

Тук ще се опитам да сложа всичко по рафтовете. Номерата в списъка отговарят на номерата в коментара.

  1. 1. Създайте множествен манипулатор;
  2. 2. Ще напишем функцията add_url_to_multi_handle() малко по-късно. При всяко извикване ще се обработва нов URL адрес. Първоначално добавяме 10 ($max_connections) URL адреса;
  3. 3. За да започнем, трябва да изпълним функцията curl_multi_exec(). Докато връща CURLM_CALL_MULTI_PERFORM, все още имаме работа за вършене. Нуждаем се от това главно, за да създаваме връзки;
  4. 4. Следва основният цикъл, който ще се изпълнява, докато имаме поне една активна връзка;
  5. 5. curl_multi_select() виси в очакване за завършване на URL търсенето;
  6. 6. Още веднъж трябва да накараме cURL да свърши някаква работа, а именно да извлече върнатите данни за отговор;
  7. 7. Информацията се проверява тук. В резултат на заявката ще бъде върнат масив;
  8. 8. Върнатият масив съдържа cURL манипулатор. Това е, което ще използваме, за да извлечем информация за конкретна cURL заявка;
  9. 9. Ако връзката е била мъртва или времето на скрипта е изтекло, тогава не трябва да търсим http код;
  10. 10. Ако връзката ни върна страница 404, тогава http кодът ще съдържа стойността 404;
  11. 11. В противен случай имаме работеща връзка пред нас. (Можете да добавите допълнителни проверки за код на грешка 500 и т.н.);
  12. 12. След това премахваме манипулатора на cURL, защото вече не ни трябва;
  13. 13. Сега можем да добавим друг url и да стартираме всичко, за което говорихме преди;
  14. 14. На тази стъпка скриптът приключва работата си. Можем да премахнем всичко ненужно и да генерираме отчет;
  15. 15. Накрая ще напишем функция, която ще добави url към манипулатора. Статичната променлива $index ще се увеличава при всяко извикване на тази функция.

Използвах този скрипт в моя блог (с някои повредени връзки, добавени нарочно, за да го тествам) и получих следния резултат:

В моя случай скриптът отне малко под 2 секунди, за да премине през 40 URL адреса. Увеличаването на производителността е значително, когато работите с още повече URL адреси. Ако отворите десет връзки едновременно, скриптът може да работи десет пъти по-бързо.

Няколко думи за други полезни опции за cURL

HTTP удостоверяване

Ако URL адресът има HTTP удостоверяване, можете лесно да използвате следния скрипт:

$url = "http://www.somesite.com/members/"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // посочете потребителско име и парола curl_setopt($ch, CURLOPT_USERPWD, "myusername:mypassword"); // ако пренасочването е разрешено curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // след това запазете нашите данни в cURL curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1); $изход = curl_exec($ch); curl_close($ch);

FTP качване

PHP също има библиотека за работа с FTP, но нищо не ви пречи да използвате cURL инструменти тук:

// отваряне на файл $file = fopen("/path/to/file", "r"); // url трябва да съдържа следното съдържание $url = "ftp://username: [имейл защитен]:21/път/към/нов/файл"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_UPLOAD, 1); curl_setopt($ch, CURLOPT_INFILE, $fp); curl_setopt($ch, CURLOPT_INFILESIZE, filesize("/path/to/file")); // посочва ASCII мод curl_setopt($ch, CURLOPT_FTPASCII, 1); $output = curl_exec ($ch); curl_close($ch);

Използване на прокси

Можете да направите своята URL заявка чрез прокси:

$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"http://www.example.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // посочете адреса curl_setopt($ch, CURLOPT_PROXY, "11.11.11.11:8080"); // ако трябва да предоставите потребителско име и парола curl_setopt($ch, CURLOPT_PROXYUSERPWD,"user:pass"); $изход = curl_exec($ch); curl_close($ch);

Обратни повиквания

Също така е възможно да се укаже функция, която ще се задейства дори преди cURL заявката да завърши. Например, докато съдържанието на отговор се зарежда, можете да започнете да използвате данните, без да чакате да се зареди напълно.

$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"http://net.tutsplus.com"); curl_setopt($ch, CURLOPT_WRITEFUNCTION,"прогрес_функция"); curl_exec($ch); curl_close($ch); функция progress_function($ch,$str) (ехо $str; връщане strlen($str);)

Такава функция ТРЯБВА да върне дължината на низа, което е изискване.

Заключение

Днес се запознахме с това как можете да използвате библиотеката cURL за свои егоистични цели. Надявам се тази статия да ви е харесала.

Благодаря ти! Приятен ден!

И така, сега ще говоря за това как да хакнете нещо без специални познания за нищо. Веднага казвам, че има малка полза от това, но все пак.
Първо, трябва да намерите самите сайтове. За да направите това, отидете на google.com и потърсете dorks

Inurl:pageid= inurl:games.php?id= inurl:page.php?file= inurl:newsDetail.php?id= inurl:gallery.php?id= inurl:article.php?id= inurl:show.php? id= inurl:staff_id= inurl:newsitem.php?num= inurl:readnews.php?id= inurl:top10.php?cat= inurl:historialeer.php?num= inurl:reagir.php?num= inurl:Stray- Questions-View.php?num= inurl:forum_bds.php?num= inurl:game.php?id= inurl:view_product.php?id= inurl:newsone.php?id= inurl:sw_comment.php?id= inurl: news.php?id= inurl:avd_start.php?avd= inurl:event.php?id= inurl:product-item.php?id= inurl:sql.php?id= inurl:news_view.php?id= inurl: select_biblio.php?id= inurl:humor.php?id= inurl:aboutbook.php?id= inurl:ogl_inet.php?ogl_id= inurl:fiche_spectacle.php?id= inurl:communique_detail.php?id= inurl:sem. php3?id= inurl:kategorie.php4?id= inurl:news.php?id= inurl:index.php?id= inurl:faq2.php?id= inurl:show_an.php?id= inurl:preview.php? id= inurl:loadpsb.php?id= inurl:opinions.php?id= inurl:spr.php?id= inurl:pages.php?id= inurl:announce.php?id= inurl:clanek.php4?id= inurl:participant.php?id= inurl:download.php?id= inurl:main.php?id= inurl:review.php?id= inurl:chappies.php?id= inurl:read.php?id= inurl: prod_detail.php?id= inurl:viewphoto.php?id= inurl:article.php?id= inurl:person.php?id= inurl:productinfo.php?id= inurl:showimg.php?id= inurl:view. php?id= inurl:website.php?id= inurl:hosting_info.php?id= inurl:gallery.php?id= inurl:rub.php?idr= inurl:view_faq.php?id= inurl:artikelinfo.php? id= inurl:detail.php?ID= inurl:index.php?= inurl:profile_view.php?id= inurl:category.php?id= inurl:publications.php?id= inurl:fellows.php?id= inurl :downloads_info.php?id= inurl:prod_info.php?id= inurl:shop.php?do=part&id= inurl:productinfo.php?id= inurl:collectionitem.php?id= inurl:band_info.php?id= inurl :product.php?id= inurl:releases.php?id= inurl:ray.php?id= inurl:produit.php?id= inurl:pop.php?id= inurl:shopping.php?id= inurl:productdetail .php?id= inurl:post.php?id= inurl:viewshowdetail.php?id= inurl:clubpage.php?id= inurl:memberInfo.php?id= inurl:section.php?id= inurl:theme.php ?id= inurl:page.php?id= inurl:shredder-categories.php?id= inurl:tradeCategory.php?id= inurl:product_ranges_view.php?ID= inurl:shop_category.php?id= inurl:transcript.php ?id= inurl:channel_id= inurl:item_id= inurl:newsid= inurl:trainers.php?id= inurl:news-full.php?id= inurl:news_display.php?getid= inurl:index2.php?option= inurl :readnews.php?id= inurl:top10.php?cat= inurl:newsone.php?id= inurl:event.php?id= inurl:product-item.php?id= inurl:sql.php?id= inurl :aboutbook.php?id= inurl:preview.php?id= inurl:loadpsb.php?id= inurl:pages.php?id= inurl:material.php?id= inurl:clanek.php4?id= inurl:announce .php?id= inurl:chappies.php?id= inurl:read.php?id= inurl:viewapp.php?id= inurl:viewphoto.php?id= inurl:rub.php?idr= inurl:galeri_info.php ?l= inurl:review.php?id= inurl:iniziativa.php?in= inurl:curriculum.php?id= inurl:labels.php?id= inurl:story.php?id= inurl:look.php? ID= inurl:newsone.php?id= inurl:aboutbook.php?id= inurl:material.php?id= inurl:opinions.php?id= inurl:announce.php?id= inurl:rub.php?idr= inurl:galeri_info.php?l= inurl:tekst.php?idt= inurl:newscat.php?id= inurl:newsticker_info.php?idn= inurl:rubrika.php?idr= inurl:rubp.php?idr= inurl: offer.php?idf= inurl:art.php?idm= inurl:title.php?id= inurl:".php?id=1" inurl:".php?cat=1" inurl:".php?catid= 1" inurl:".php?num=1" inurl:".php?bid=1" inurl:".php?pid=1" inurl:".php?nid=1"

ето малък откъс. Можете да използвате вашия. И така, намерихме сайта. Например http://www.vestitambov.ru/
След това изтеглете тази програма

**Скрито съдържание: За да видите това скрито съдържание, броят на вашите публикации трябва да е 3 или повече.**

Натиснете OK. След това вмъкваме мястото на жертвата.
Натискаме старт. След това чакаме резултатите.
И така, програмата откри SQL уязвимост.

След това изтеглете Havij, http://www.vestitambov.ru:80/index.php?module=group_programs&id_gp= поставете получената връзка там. Няма да обяснявам как да използвате Havij и къде да го изтеглите, не е трудно да го намерите. Всичко. Получихте данните, от които се нуждаете - паролата на администратора, а нататък остава на вашето въображение.

P.S. Това е първият ми опит да напиша нещо. Съжалявам, ако е грешно

Как да търсите с помощта на google.com

Вероятно всеки знае как да използва търсачка като Google =) Но не всеки знае, че ако правилно съставите заявка за търсене, използвайки специални структури, можете да постигнете резултатите от това, което търсите, много по-ефективно и по-бързо =) В тази статия Ще се опитам да покажа това и как трябва да направите, за да търсите правилно

Google поддържа няколко оператора за разширено търсене, които имат специално значение при търсене в google.com. Обикновено тези оператори променят търсенето или дори казват на Google да извършва напълно различни видове търсения. Например строителството връзка:е специален оператор, а заявката връзка: www.google.comняма да ви даде нормално търсене, а вместо това ще намери всички уеб страници, които имат връзки към google.com.
алтернативни видове заявки

кеш:Ако включите други думи в заявката, Google ще маркира тези включени думи в кеширания документ.
Например, кеш:www.уеб сайтще покаже кеширано съдържание с подчертана думата "web".

връзка:горната заявка за търсене ще покаже уеб страници, които съдържат връзки към посочената заявка.
Например: връзка: www.websiteще покаже всички страници, които имат връзка към http://www.site

свързани:Показва уеб страници, които са „свързани“ с посочената уеб страница.
Например, свързани: www.google.comще покаже уеб страници, които са подобни на началната страница на Google.

информация:Искане на информация: ще предостави информация, която Google има за исканата уеб страница.
Например, информация: уебсайтще покаже информация за нашия форум =) (Армада - Форум на възрастни уеб администратори).

Други искания за информация

дефинирам:Заявката define: ще предостави дефиниция на думите, които въвеждате след това, събрана от различни онлайн източници. Дефиницията ще бъде за цялата въведена фраза (т.е. ще включва всички думи в точната заявка).

запаси:Ако започнете заявка с акции: Google ще обработи останалите термини на заявката като борсови тикери и ще направи връзка към страница, показваща подготвената информация за тези знаци.
Например, акции: intel yahooще покаже информация за Intel и Yahoo. (Имайте предвид, че трябва да въведете знаци за извънредни новини, а не името на компанията)

Модификатори на заявки

сайт:Ако включите site: в заявката си, Google ще ограничи резултатите до уебсайтовете, които намери в този домейн.
Можете също да търсите отделни зони, като ru, org, com и т.н. сайт:com сайт: ru)

allintitle:Ако стартирате заявка с allintitle:, Google ще ограничи резултатите с всички думи на заявката в заглавието.
Например, allintitle: търсене в Googleще върне всички страници за търсене в Google като изображения, блог и т.н

заглавие:Ако включите intitle: в заявката си, Google ще ограничи резултатите до документи, съдържащи тази дума в заглавието.
Например, заглавие: Бизнес

allinurl:Ако стартирате заявка с allinurl: Google ще ограничи резултатите с всички думи на заявката в URL адреса.
Например, allinurl: търсене в Googleще върне документи с google и търсене в заглавието. Освен това, като опция, можете да разделяте думите с наклонена черта (/), след което думите от двете страни на наклонената черта ще бъдат търсени в една и съща страница: Пример allinurl: foo/бар

inurl:Ако включите inurl: в заявката си, Google ще ограничи резултатите до документи, съдържащи тази дума в URL адреса.
Например, Анимация inurl:уебсайт

текст:търси само в текста на страницата за посочената дума, игнорира заглавието и текстовете на връзките и други неща, които не са свързани с. Има и производно на този модификатор - allintext:тези. освен това, всички думи в заявката ще бъдат търсени само в текста, което също е важно, като се игнорират често използвани думи във връзките
Например, intext:форум

период от време:търси във времеви рамки (диапазон от дати: 2452389-2452389), датите за време са посочени в юлиански формат.

Е, и всякакви интересни примери за заявки

Примери за компилиране на заявки за Google. За спамъри

inurl:control.guest?a=знак

Site:books.dreambook.com „URL адрес на началната страница“ „Подпишете моя“ inurl:sign

Сайт: www.freegb.net Начална страница

Inurl:sign.asp "Брой знаци"

„Съобщение:“ inurl:sign.cfm „Подател:“

inurl:register.php „Регистрация на потребител“ „Уебсайт“

Inurl:edu/guestbook „Подпишете се в книгата за гости“

Inurl:post "Публикуване на коментар" "URL"

Inurl:/archives/ „Коментари:“ „Запомняте ли информация?“

„Сценарий и книга за гости, създадени от:“ „URL:“ „Коментари:“

inurl:?action=add “phpBook” “URL”

Заглавие: „Изпратете нова история“

Списания

inurl:www.livejournal.com/users/mode=reply

inurl greatestjournal.com/mode=reply

Inurl:fastbb.ru/re.pl?

Inurl:fastbb.ru /re.pl? "Книга за гости"

Блогове

Inurl:blogger.com/comment.g?”postID”"анонимен"

Inurl:typepad.com/ „Публикувайте коментар“ „Запомняте ли лична информация?“

Inurl:greatestjournal.com/community/ „Публикуване на коментар“ „адреси на анонимни плакати“

„Публикуване на коментар“ „адреси на анонимни плакати“ -

Заглавие: "Публикуване на коментар"

Inurl:pirillo.com „Публикуване на коментар“

Форуми

Inurl:gate.html?”name=Forums” “mode=reply”

inurl:”forum/posting.php?mode=reply”

inurl:"mes.php?"

inurl:”members.html”

inurl:forum/memberlist.php?“

Тази статия трябваше да бъде пренаписана отдавна (твърде много „спестявания на мачове“), но ръцете не достигат. Нека тежи и ни напомня колко сме глупави на младини.
Един от основните критерии за успех на всеки интернет ресурс е скоростта на неговата работа и всяка година потребителите стават все по-взискателни по този критерий. Оптимизацията на php скриптове е един от методите за осигуряване на бързина на системата.
В тази статия бих искал да представя на обществеността моята колекция от съвети и факти за оптимизиране на скриптове. Колекцията е събирана от мен доста дълго време, въз основа на няколко източника и лични експерименти.
Защо колекция от съвети и факти, а не твърди и бързи правила? Защото, както видях, няма "абсолютно правилна оптимизация". Много техники и правила са противоречиви и е невъзможно всички да бъдат изпълнени. Трябва да изберете набор от методи, които са приемливи за използване, без да жертвате сигурността и удобството. Заех позиция на съветник и следователно имам съвети и факти, които можете или не можете да следвате.
За да избегна объркване, разделих всички съвети и факти на 3 групи:

  • Оптимизация на кода
  • Безполезна оптимизация
Групите са разпределени условно и някои елементи могат да бъдат приписани на няколко от тях наведнъж. Цифрите са дадени за средния сървър (LAMP). Статията не разглежда въпроси, свързани с ефективността на различни технологии и рамки на трети страни, тъй като това е тема за отделни дискусии.

Оптимизация на ниво логика и организация на приложението

Много от съветите и фактите, свързани с тази група за оптимизация, са много важни и дават много голяма печалба във времето.
  • Постоянно профилирайте своя код на сървъра (xdebug) и на клиента (firebug), за да идентифицирате тесните места в кода
    Трябва да се отбележи, че трябва да профилирате както сървърната, така и клиентската част, тъй като не всички сървърни грешки могат да бъдат открити на самия сървър.
  • Броят на дефинираните от потребителя функции, използвани в програмата, не влияе на скоростта по никакъв начин
    Това ви позволява да използвате безкраен брой дефинирани от потребителя функции в програмата.
  • Използвайте активно персонализирани функции
    Положителен ефект се постига поради факта, че вътре във функциите се извършват операции само с локални променливи. Ефектът от това е по-голям от цената на извикванията на дефинирани от потребителя функции.
  • Желателно е да се внедрят „критично тежки“ функции на език за програмиране на трета страна като разширение на PHP
    Това изисква умения за програмиране на език на трета страна, което значително увеличава времето за разработка, но в същото време ви позволява да използвате трикове извън възможностите на PHP.
  • Обработката на статичен html файл е по-бърза от интерпретиран php файл
    Разликата във времето на клиента може да бъде около 1 секунда, така че ясното разделяне на статичните и генерираните от PHP страници има смисъл.
  • Размерът на обработения (свързания) файл влияе върху скоростта
    Приблизително 0,001 секунди се изразходват за обработка на всеки 2 KB. Този факт ни кара да минимизираме кода на скрипта, когато го прехвърляме към производствен сървър.
  • Опитайте се да не използвате постоянно require_once или include_once
    Тези функции трябва да се използват, когато е възможно препрочитане на файла, в други случаи е желателно да се използват require и include.
  • При разклоняване на алгоритъма, ако има конструкции, които може да не бъдат обработени и техният обем е около 4 KB или повече, тогава е по-оптимално да ги включите с помощта на include.
  • Препоръчително е да използвате валидиране на изпратените данни на клиента
    Това се дължи на факта, че при валидиране на данни от страна на клиента, броят на заявките с некоректни данни е драстично намален. Системите за валидиране на данни от страна на клиента са изградени предимно с помощта на JS и твърди елементи (изберете).
  • Желателно е да се изграждат големи DOM конструкции за масиви от данни на клиента
    Това е много ефективна техника за оптимизация, когато се работи с показване на големи количества данни. Същността му се свежда до следното: масив от данни се подготвя на сървъра и се прехвърля на клиента, а изграждането на DOM структури се предоставя на JS функции. В резултат на това натоварването се преразпределя частично от сървъра към клиента.
  • Системите, изградени върху технологията AJAX, са много по-бързи от системите, които не използват тази технология.
    Това се дължи на намаляване на обемите на теглене и преразпределение на натоварването върху клиента. На практика скоростта на системите с AJAX е 2-3 пъти по-висока. коментар: AJAX от своя страна създава редица ограничения върху използването на други методи за оптимизация, като например работа с буфер.
  • Когато получавате заявка за публикация, винаги връщайте нещо, дори интервал
    В противен случай на клиента ще бъде изпратена страница за грешка, която тежи няколко килобайта. Тази грешка е много често срещана в системи, използващи технологията AJAX.
  • Получаването на данни от файл е по-бързо, отколкото от база данни
    Това до голяма степен се дължи на разходите за свързване към базата данни. За моя изненада огромен процент от програмистите маниакално съхраняват всички данни в база данни, дори когато използването на файлове е по-бързо и по-удобно. коментар:файловете могат да съхраняват данни, които не се търсят, в противен случай трябва да се използва база данни.
  • Не се свързвайте с базата данни без нужда
    По неизвестна за мен причина много програмисти се свързват с базата данни на етапа на четене на настройките, въпреки че може да не правят допълнителни заявки към базата данни. Това е лош навик, който струва средно 0,002 секунди.
  • Използвайте постоянна връзка с база данни с малък брой едновременно активни клиенти
    Ползата във времето се дължи на липсата на разходи за свързване към базата данни. Времевата разлика е приблизително 0,002 секунди. коментар:при голям брой потребители постоянните връзки са нежелателни. Когато се работи с постоянни връзки, трябва да има механизъм за прекратяване на връзките.
  • Използването на сложни заявки за база данни е по-бързо от използването на няколко прости
    Разликата във времето зависи от много фактори (обем на данни, настройки на базата данни и т.н.) и се измерва в хилядни, а понякога дори и в стотни от секундата.
  • Използването на странични изчисления на СУБД е по-бързо от страничните изчисления на PHP за данни, съхранявани в базата данни
    Това се дължи на факта, че за такива изчисления от страна на PHP са необходими две заявки към базата данни (получаване и промяна на данни). Разликата във времето зависи от много фактори (обем на данни, настройки на базата данни и др.) и се измерва в хилядни и стотни от секундата.
  • Ако примерните данни от базата данни рядко се променят и много потребители имат достъп до тези данни, тогава има смисъл да запишете примерните данни във файл
    Например, можете да използвате следния прост подход: получаваме примерните данни от базата данни и ги запазваме като сериализиран масив във файл, след което всеки потребител използва данните от файла. На практика този метод за оптимизация може да даде многократно увеличение на скоростта на изпълнение на скрипта. коментар:Когато използвате този метод, е необходимо да напишете инструменти за генериране и модифициране на данните, съхранявани във файла.
  • Кеширане на данни, които рядко се променят с memcached
    Печалбата във времето може да бъде доста значителна. коментар:кеширането е ефективно за статични данни, за динамични данни ефектът е намален и може да бъде отрицателен.
  • Работата без обекти (без ООП) е около три пъти по-бърза от работата с обекти
    Паметта също се "изяжда" повече. За съжаление PHP интерпретаторът не може да обработва ООП толкова бързо, колкото обикновените функции.
  • Колкото по-голяма е размерността на масивите, толкова по-бавно работят.
    Загубата на време възниква от обработката на влагането на структури.

Оптимизация на кода

Тези съвети и факти дават леко увеличение на скоростта в сравнение с предишната група, но взети заедно, тези техники могат да дадат добра печалба във времето.
  • echo и print са значително по-бързи от printf
    Разликата във времето може да бъде до няколко хилядни от секундата. Това е така, защото printf се използва за извеждане на форматирани данни и интерпретаторът проверява целия ред за такива данни. printf се използва само за извеждане на данни, които се нуждаят от форматиране.
  • echo $var."text" е по-бързо от echo "$var.text"
    Това е така, защото PHP машината във втория случай е принудена да търси променливи вътре в низа. За големи количества данни и по-стари версии на PHP разликите във времето са забележими.
  • echo "a" е по-бързо от echo "a" за низове без променливи
    Това е така, защото във втория случай PHP машината се опитва да намери променливите. За големи количества данни разликите във времето са доста забележими.
  • echo "a", "b" е по-бързо от echo "a"."b"
    Извеждането на данни, разделени със запетая, е по-бързо от данните, разделени с точки. Това е така, защото конкатенацията на низове се случва във втория случай. За големи количества данни разликите във времето са доста забележими. Забележка:това работи само с функцията echo, която може да приема няколко реда като аргументи.
  • $return="a"; $return.="b"; ехо $връщане; по-бързо от ехо "а"; ехо "b";
    Причината е, че извеждането на данни изисква някои допълнителни операции. За големи количества данни разликите във времето са доста забележими.
  • ob_start(); ехо "а"; ехо "b"; ob_end_flush(); по-бързо от $return="a"; $return.="b"; ехо $връщане;
    Това е така, защото цялата работа се извършва без достъп до променливи. За големи количества данни разликите във времето са доста забележими. коментар:тази техника не е ефективна, ако работите с AJAX, тъй като в този случай е желателно данните да се връщат като един ред.
  • Използвайте „професионална вложка“ или? > a b
    Статичните данни (външен код) се обработват по-бързо от PHP изхода. Тази техника се нарича професионално вмъкване. За големи количества данни разликите във времето са доста забележими.
  • readfile е по-бърз от file_get_contents, file_get_contents е по-бърз от require и require е по-бърз от include за извеждане на статично съдържание от един файл
    Времето за четене на празен файл варира от 0,001 за readfile до 0,002 за include.
  • изискването е по-бързо от включването за интерпретирани файлове
    коментар:когато разклонявате алгоритъма, когато е възможно да не използвате интерпретирания файл, трябва да използвате include, т.к. изисква винаги включва файл.
  • if (...) (...) else if (...) () е по-бързо от switch
    Времето зависи от броя на клоните.
  • if (...) (...) else if (...) () е по-бързо от if (...) (...); ако(...)();
    Времето зависи от броя на клоновете и условията. Трябва да използвате else if, където е възможно, тъй като това е най-бързата „условна“ конструкция.
  • Най-често срещаните условия на конструкцията if (...) (...) else if (...) () трябва да бъдат поставени в началото на клона
    Интерпретаторът сканира структурата отгоре надолу, докато намери условие. Ако интерпретаторът установи, че условието е изпълнено, той не преглежда останалата част от структурата.
  • < x; ++$i) {...} быстрее, чем for($i = 0; $i < sizeOf($array); ++$i) {...}
    Това е така, защото във втория случай операцията sizeOf ще се изпълнява при всяка итерация. Разликата във времето за изпълнение зависи от броя на елементите на масива.
  • x = sizeOf($масив); за ($i = 0; $i< x; ++$i) {...} быстрее, чем foreach($arr as $value) {...} для не ассоциативных массивов
    Разликата във времето е значителна и се увеличава с нарастването на масива.
  • preg _replace е по-бърз от ereg_replace, str_replace е по-бърз от preg_replace, но strtr е по-бърз от str_replace
    Времевата разлика зависи от количеството данни и може да достигне няколко хилядни от секундата.
  • Функциите за низове са по-бързи от регулярните изрази
    Това правило е следствие от предишното.
  • Изтрийте вече ненужните променливи на масива, за да освободите памет.
  • Избягвайте използването на потискане на грешки @
    Потискането на грешки води до множество много бавни операции и тъй като честотата на повторение може да бъде много висока, загубата на скорост може да бъде значителна.
  • if (isset($str(5))) (...) е по-бърз от if (strlen($str)>4)(...)
    Това е така, защото стандартната операция за проверка на isset се използва вместо функцията за низ strlen.
  • 0,5 е по-бързо от 1/2
    Причината е, че във втория случай се извършва операция по разделяне.
  • return е по-бърз от глобалния, когато връща стойността на променлива от функция
    Това е така, защото във втория случай се създава глобална променлива.
  • $row["id"] е по-бърз от $row
    Първият вариант е 7 пъти по-бърз.
  • $_SERVER['REQUEST_TIME'] е по-бърз от time() за определяне кога трябва да се изпълнява скрипт
  • if ($var===null) (...) е по-бързо от if (is_null($var)) (...)
    Причината е, че в първия случай няма използване на функция.
  • ++i е по-бърз от i++, --i е по-бърз от i--
    Това се дължи на функция на PHP ядрото. Разликата във времето е по-малка от 0,000001, но ако тези процедури се повтарят хиляди пъти, погледнете по-отблизо тази оптимизация.
  • Увеличаване на инициализираната променлива i=0; ++i; по-бързо от неинициализиран ++i
    Разликата във времето е около 0,000001 секунди, но поради възможната честота на повторение, този факт трябва да се помни.
  • Използването на "използвани" променливи е по-бързо от декларирането на нови
    Или да го перифразираме по различен начин - Не създавайте ненужни променливи.
  • Работата с локални променливи е около 2 пъти по-бърза от тази с глобалните
    Въпреки че разликата във времето е по-малка от 0,000001 секунди, поради високата честота на повторение, трябва да опитате да работите с локални променливи.
  • Директният достъп до променлива е по-бърз от извикването на функция, в която тази променлива е дефинирана няколко пъти
    Извикването на функция отнема около три пъти повече време, отколкото извикването на променлива.

Безполезна оптимизация

Редица методи за оптимизация на практика не оказват голямо влияние върху скоростта на изпълнение на скрипта (печалбата във времето е по-малка от 0,000001 секунди). Въпреки това подобна оптимизация често е обект на спорове. Донесох тези "безполезни" факти, за да не им обръщате специално внимание, когато пишете код по-късно.
  • echo е по-бързо от print
  • include("абсолютен път") е по-бърз от include("относителен път")
  • sizeOf е по-бърз от count
  • foreach ($arr като $key => $value) (...) е по-бърз от reset($arr); докато (списък($ключ, $стойност) = всеки ($arr)) (...) за асоциативни масиви
  • Некоментираният код е по-бърз от коментирания, защото отнема допълнително време за четене на файла
    Много е глупаво да намалявате обема на коментарите в името на оптимизацията, просто трябва да го минимизирате в работещи („бойни“) скриптове.
  • Променливите с кратки имена са по-бързи от променливите с дълги имена
    Това се дължи на намаляването на количеството код, който се обработва. Подобно на предишната точка, просто трябва да го минимизирате в работещи („бойни“) скриптове.
  • Маркирането на код с помощта на раздели е по-бързо от използването на интервали
    Подобно на предишната точка.
Накрая искам още веднъж да напомня, че съветите и фактите, които дадох, не са абсолютни и значимостта на тяхното прилагане зависи от конкретната ситуация. Трябва да се помни, че оптимизирането на скрипта е само малка част от цялата процедура за оптимизиране и често е възможно да се живее без горните съвети.

За написването на статията са използвани частично материали.

 
Статии оттема:
Паста с риба тон в кремообразен сос Паста с прясна риба тон в кремообразен сос
Пастата с риба тон в кремообразен сос е ястие, от което всеки ще си глътне езика, разбира се, не само за удоволствие, а защото е безумно вкусно. Риба тон и паста са в перфектна хармония помежду си. Разбира се, може би някой няма да хареса това ястие.
Пролетни рулца със зеленчуци Зеленчукови рулца у дома
Така че, ако се борите с въпроса „каква е разликата между суши и ролки?“, Ние отговаряме - нищо. Няколко думи за това какво представляват ролките. Ролцата не са непременно японска кухня. Рецептата за рула под една или друга форма присъства в много азиатски кухни.
Защита на флората и фауната в международните договори И човешкото здраве
Решаването на екологичните проблеми и следователно перспективите за устойчиво развитие на цивилизацията са до голяма степен свързани с компетентното използване на възобновяеми ресурси и различни функции на екосистемите и тяхното управление. Тази посока е най-важният начин за получаване
Минимална заплата (минимална заплата)
Минималната работна заплата е минималната работна заплата (SMIC), която се одобрява от правителството на Руската федерация ежегодно въз основа на Федералния закон „За минималната работна заплата“. Минималната работна заплата се изчислява за изпълнената месечна норма труд.