Vigostruemo ოსტატობის რობოტები cURL-ით. CURL არ მუშაობს Apache-თან როგორ გავარკვიოთ რა cURL მუშაობს თქვენთან

cURL არის სპეციალური ინსტრუმენტი, რომელიც გამოიყენება ფაილებისა და მონაცემების გადასატანად URL სინტაქსის გამოყენებით. ტექნოლოგია მოცემულიამხარს უჭერს უკაბელო პროტოკოლებს, როგორიცაა HTTP, FTP, TELNET და მრავალი სხვა. cURL დაიშალა როგორც ინსტრუმენტი ბრძანების სტრიქონი. ჩვენდა საბედნიეროდ, cURL ბიბლიოთეკას მხარს უჭერს ჩემი PHP პროგრამირება. ეს სტატია განიხილავს როგორ გავაფართოვოთ cURL ფუნქციები, ასევე როგორ ეფექტურად ამოიღოთ ცოდნა PHP-დან.

რატომ cURL?

სინამდვილეში, როგორც ჩანს, მართალია ალტერნატიული მეთოდებიაირჩიეთ ვებსაიტის ადგილმდებარეობა. ხშირ შემთხვევაში, თავდაყირა, cURL-ის ნაცვლად ვიყენებდი მარტივ PHP ფუნქციებს:

$content = file_get_contents ("http://www.nettuts.com"); //ან $lines = ფაილი ("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);

Croc # 2 (შემდეგ, დააჭირეთ curl_setopt ()) ამ სტატიაში უფრო დეტალურად განვიხილავთ, ყველა სხვა ეტაპის ქვემოთ, რადგან ამ ეტაპზე იქნება ყველაფერი, რაც თქვენ უნდა იცოდეთ. cURL-ს აქვს სხვადასხვა ვარიანტების დიდი რაოდენობა, რომლებიც უნდა იყოს მითითებული, რათა შესაძლებელი იყოს URL-ის მოთხოვნების ყველაზე გაუმჯობესებული კონფიგურაცია. ჩვენ არ განვიხილავთ მთლიან ჩამონათვალს მთლიანობაში, მაგრამ ყურადღებას გავამახვილებთ მხოლოდ მათზე, ვისზეც მაინტერესებს საჭიროებები და ამისათვის სასარგებლო გაკვეთილები. თუ ეს თემა გაინტერესებთ, შეგიძლიათ თავად გაარკვიოთ ყველაფერი.

პომილკის ხელახალი შემოწმება

მანამდე შეიძლება ვიკორისტიც გახდე ჭკვიანი ოპერატორებითქვენი ოპერაციის წარმატების შესამოწმებლად:

//... $გამომავალი = curl_exec($ch); if ($output === FALSE) (echo "cURL Error:". curl_error($ch);) // ...

აქვე გთხოვთ, შენიშნოთ თქვენთვის ძალიან მნიშვნელოვანი მომენტი: ჩვენ ვართ დამნაშავე, რომ გამოვიყენებთ „=== false“-ს გასათანაბრებლად, შეცვალეთ „== false“. მათთვის, ვინც არ იცის, ეს დაგვეხმარება ამოვიცნოთ ცარიელი შედეგი, როგორც false-ის ლოგიკური მნიშვნელობა, რომელიც მიუთითებს შესწორებაზე.

ინფორმაციის მოძიება

კიდევ ერთი დამატებითი ნაბიჯი არის ინფორმაციის ამოღება cURL ჩანაწერების შესახებ, ამის შემდეგ, როგორც ჩვენ შევდივართ.

//...curl_exec($ch); $info = curl_getinfo ($ch); ექო "აიღო". $Info ["total_time"]. "წამები url-ისთვის". $Info["url"]; //...

მასივი ბრუნავს ხელმისაწვდომი ინფორმაციის საჩვენებლად:

  • "URL"
  • "Შინაარსის ტიპი"
  • "Http_code"
  • "Header_size"
  • "მოთხოვნის_ ზომა"
  • "ფაილის დრო"
  • "Ssl_verify_result"
  • "გადამისამართების_ რაოდენობა"
  • "სულ_დრო"
  • "Namelookup_time"
  • "Connect_time"
  • "წინასწარი_დრო"
  • "Size_upload"
  • "Size_ჩამოტვირთვა"
  • "სიჩქარე_ჩამოტვირთვა"
  • "Speed_ატვირთვა"
  • "ჩამოტვირთვა_კონტენტის_სიგრძე"
  • "ატვირთვის_კონტენტის_სიგრძე"
  • "გადაცემის_დრო"
  • "გადამისამართების_დრო"

გადამისამართება გამოჩნდება ბრაუზერში

პირველი აპლიკაციისთვის ჩვენ დავწერთ კოდს, რომელსაც შეუძლია URL-ის გადამისამართების ჩვენება სხვადასხვა პარამეტრებიბრაუზერი. მაგალითად, ვებსაიტებს შეუძლიათ ბრაუზერების გადამისამართება სტილნიკოვის ტელეფონი, ან იქნებ სხვა რამე ავაშენო.

ჩვენ ვირჩევთ CURLOPT_HTTPHEADER ოფციის გამოყენებას ჩვენი გამომავალი HTTP სათაურების იდენტიფიცირებისთვის, მომხმარებლის ბრაუზერის სახელის და ხელმისაწვდომი ვიდეოების ჩათვლით. და ბოლოს, ჩვენ შეგვიძლია განვსაზღვროთ, რომელი საიტები გვიგზავნიან სხვადასხვა URL-ებზე.

//სატესტო URL $urls = array("http://www.cnn.com", "http://www.mozilla.com", "http://www.facebook.com"); // ბრაუზერების ტესტირება $ ბრაუზერები = მასივი ( "სტანდარტული" => მასივი ( "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) "," ენა "=>" en-us, en q = 0.5 ")," iphone "=> მასივი ("user_agent"=>" Mozilla / 5.0 (iPhone; U; ; CPU, როგორიცაა Mac OS X; => "Mozilla / 4.0 (თავსებადი; MSIE 7.0; Windows NT 5.1; GTB6; .NET CLR 2.0.50727)", "language" => "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, მასივი("მომხმარებლის-აგენტი: ($ბროუზერი["user_agent"]), "Accept-Language: ($browser["language"])" ) // ჩვენ არ გვჭირდება curl_setopt ($ ch, CURLOPT_NOBODY, 1 // ჩვენ უნდა წავშალოთ HTTP სათაურები curl_setopt ($ ch, CURLOPT_HEADER, 1 // გამომავალი curl_setopt ($ ch, CURLOPTRE)); , 1 $output = curl_exec($ch curl_close: $test_name: გადამისამართება $matches\n";) else (echo" $test_name: no redirection\n";)); \n";)

უპირველეს ყოვლისა, ჩვენ ვაძლევთ იმ საიტების URL-ების ჩამონათვალს, რომლებსაც შევამოწმებთ. უფრო ზუსტად, ჩვენ გვჭირდება ამ საიტების მისამართები. შემდეგი, ჩვენ უნდა შევცვალოთ თქვენი ბრაუზერის პარამეტრები, რათა წინააღმდეგი გავუწიოთ ამ URL-ს. რის შემდეგაც ჩვენ გავდივართ სწრაფ ციკლს, რომელშიც გავდივართ ყველა იმ შედეგს, რაც წაგვართვეს.

ტექნიკა, რომელსაც ჩვენ ვიყენებთ ამ აპლიკაციაში, არის cURL-ის კონფიგურაცია, რათა მოგვცეს არა გვერდის სივრცის ამოღება, არამედ მხოლოდ HTTP სათაურები (დაზოგვა $output-ში). ახლა, როდესაც სწრაფად ვაპატიეთ რეგექსი, ჩვენ ვხედავთ, რომ არჩეულ სათაურებში არის სტრიქონი "ადგილმდებარეობა:".

როცა გარბიხარ დანიის კოდი, მაშინ თქვენ პასუხისმგებელი იქნებით მიახლოებითი შედეგის უარყოფაზე:

შექმენით 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 მონაცემების მისაღებად და ჩვენებისთვის. კერძოდ yogo post_output.php:

Print_r ($_POST);

შემდეგ ჩვენ ვქმნით PHP სკრიპტს ისე, რომ cURL ჩანაწერი დაიწეროს:

$Url = "http://localhost/post_output.php"; $Post_data = array("foo" => "ზოლი", "query" => "Nettuts", "action" => "გაგზავნა"); $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); $output = 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); $output = curl_exec($ch); curl_close ($ch); ექო $გამომავალი;

თუ გსურთ ფაილის შეძენა, ყველაფერი რაც თქვენ გჭირდებათ რომ მიიღოთ, შემდეგ გადაიტანეთ იგი ორიგინალად პოსტ zminnu, ჯერ დადეთ @ სიმბოლო მის წინ. როდესაც თქვენ დაწერთ სკრიპტს, ნახავთ შედეგს:

multicURL

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); // შექმენით multicURL პროცესორი $ mh = curl_multi_init(); // დაამატეთ დამმუშავებლების რაოდენობა curl_multi_add_handle ($mh, $ch1); curl_multi_add_handle ($mh, $ch2); $active = null; // wiki do ($mrc = curl_multi_exec($mh, $active);) while ($mrc == CURLM_CALL_MULTI_PERFORM); while ($active && $mrc ​​== CURLM_OK) (if (curl_multi_select ($mh) != -1) (do ($mrc = curl_multi_exec ($mh, $active);) ხოლო ($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() ფუნქციისთვის. ცვლილების მნიშვნელობა დაყენებულია „true“-ზე, სანამ ნებისმიერი ცვლილება აქტიურია. შემდეგ ჩვენ მოვუწოდებთ curl_multi_select() ფუნქციას. ეს კავშირი "დაბლოკილია", სანამ არის ერთი აქტიური კავშირი, სანამ კავშირი არ გაწყდება. როდესაც ეს მოხდება, ჩვენ ვუბრუნდებით მთავარ ციკლს სასმელების სერიის გასაგრძელებლად.

ახლა კი უბრალოდ წავართვათ ცოდნა დუნდულოზე, რომელიც ნამდვილად გამოადგება ადამიანების დიდ რაოდენობას.

თქვენი შეტყობინების გადამოწმება WordPress-ში

იპოვეთ თქვენი ბლოგი დიდი რაოდენობით პოსტებითა და შეტყობინებებით, მათ შორის გარე ინტერნეტ რესურსებზე გამოქვეყნებული. სხვადასხვა მიზეზის გამო, ეს ქმედებები შეიძლება უკვე "მკვდარი" იყოს. შესაძლებელია, რომ გვერდი წაშლილია ან საიტი საერთოდ არ მუშაობს.

ჩვენ ვაპირებთ შევქმნათ სკრიპტი, რომელიც გააანალიზებს ყველა შეტყობინებას და აღმოაჩენს განტვირთვის ვებსაიტებს და 404 გვერდებს, შემდეგ კი გამოგვიგზავნის ანგარიშს.

მე დაუყოვნებლივ გეტყვით, რომ ეს არ არის WordPress-ისთვის მორგებული მოდულის მაგალითი. მთლიანობაში, ეს კარგი საცდელი ადგილია ჩვენი ტესტირებისთვის.

მოდით გავარკვიოთ ეს საფუძვლიანად. ჩვენ ვალდებულნი ვართ შევარჩიოთ ყველა ჩანაწერი მონაცემთა ბაზიდან:

// კონფიგურაცია $ db_host = "localhost"; $Db_user = "root"; $Db_pass = ""; $Db_name = "wordpress"; $Excluded_domains = მასივი ("localhost", "www.mydomain.com"); $Max_connections = 10; // ცვლადების ინიციალიზაცია $ url_list = მასივი (); $working_urls = მასივი(); $dead_urls = მასივი(); $not_found_urls = მასივი(); $active = null; // უკავშირდება MySQL-ს, თუ (! Mysql_connect ($db_host, $db_user, $db_pass)) (die ("დაკავშირება ვერ მოხერხდა:". Mysql_error());) თუ (! Mysql_select_db ($db_name)) (die ("შეუძლია არ აირჩიეთ db: ". mysql_error ());) // აირჩიეთ ყველა გამოქვეყნებული პოსტი, სადაც გაიგზავნა $ q =" აირჩიეთ 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()); ხოლო ($d = mysql_fetch_assoc ($r)) (// ჩვენ აუცილებლად ვითხოვთ დახმარებას რეგულარული ვირუსები if (preg_match_all("!href=\"(.*?)\"!, $d["post_content"], $ matches)) (foreach($ matches როგორც $url)($tmp=parse_url($url) ; if (in_array($tmp["მასპინძელი"], $excluded_domains)) (გაგრძელება;) $url_list = $url;))) // შეაგროვოს დუბლიკატები $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); $output = curl_exec($ch); curl_close ($ch);

FTP მოითხოვა

PHP-ს ასევე აქვს ბიბლიოთეკა FTP-თან მუშაობისთვის, მაგრამ არაფერზე ფიქრი არ გჭირდებათ და შეგიძლიათ სწრაფად გამოიყენოთ cURL:

//გახსენით ფაილი $file = fopen("/path/to/file", "r"); // url-ში შეიძლება იყოს ასეთი ჩანაცვლება $ url = "ftp: // მომხმარებლის სახელი: [ელფოსტა დაცულია]: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, ფაილის ზომა ("/ path/to/file") // custom ASCII mod curl_setopt ($ch, CURLOPT_FTPASCII, 1); curl_close($ch);

VikoristoProxies

თქვენ შეგიძლიათ ნახოთ თქვენი 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"); $output = curl_exec($ch); curl_close ($ch);

კარიბჭის გადამრთველის ფუნქციები

ასევე შესაძლებელია მიუთითოთ ფუნქცია, რომელიც მოითხოვს cURL-ის მოთხოვნას სამუშაოს დასრულებამდე. მაგალითად, სანამ საიტი იზიდავს თქვენ, შეგიძლიათ დაიწყოთ vikorist მონაცემები შემდგომი მიზიდულობის მოლოდინის გარეშე.

$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) (echo $str; return strlen($str);)

მსგავსი ფუნქციაა საჭირო მწკრივის ქვედა ნაწილის როტაციისთვის, რომელიც სავალდებულო მასალაა.

ვისნოვოკი

დღეს ჩვენ ვისწავლეთ, თუ როგორ შეგიძლიათ გამოიყენოთ cURL ბიბლიოთეკა საკუთარი მიზნებისთვის. დარწმუნებული ვარ, რომ თქვენ იმსახურებთ ამ სტატიას.

Გმადლობთ! Კარგ დღეს გისურვებ!

Maemo: php 5.2.3, Windows XP, Apache 1.3.33
პრობლემა ის არის, რომ cURL მოდული არ ჩანს, როდესაც PHP მუშაობს Apache-ში
php.ini გაფართოებაზე = php_curl.dll Rozkomentuvati, extension_dir ინსტალაციები სწორია,
libeay32.dll და ssleay32.dll კოპირებულია c:\windows\system32-ში.
პროტე ფუნქცია phpinfo () არ აჩვენებს cURL მოდულს ინსტალაციებს შორის და როდესაც Apache გაშვებულია, შემდეგი იწერება ჟურნალში:

PHP გაშვება: ვერ იტვირთება დინამიური ბიბლიოთეკა "c: /php/ext/php_curl.dll" - მოდულის ინსტრუქციები ვერ მოიძებნა.

თუ თქვენ მართავთ PHP-ს ბრძანების სტრიქონიდან, მაშინ სკრიპტები, რომლებიც ცვლის ბრძანებებს cURL-დან, კარგად მუშაობს, მაგრამ თუ მას აწარმოებთ Apache-დან, ხედავთ შემდეგს:
ფატალური შეცდომა: გამოძახება განუსაზღვრელ ფუნქციაზე: curl_init () - და მიუხედავად იმისა, თუ როგორ არის დაინსტალირებული PHP - როგორც CGI ან როგორც მოდული.

ინტერნეტში მე არაერთხელ მივუთითე ამ პრობლემის აღწერას - თავად cURL მოდულისთვის, გარდა იქ შემოთავაზებული გადაწყვეტილებისა, არ მეხმარება. უფრო მეტიც, მე უკვე შევცვალე PHP 5.2 PHP 5.2.3 - მაგრამ ეს არ დაეხმარა.

დავით მზარეულიანი [დოსიე]
ერთი php.ini მაქვს - დისკის ძიებით შევამოწმე. ისინი, ვინც ერთსა და იმავე php.ini-ს იყენებენ, ადვილად ადასტურებენ იმავე ფაქტით, რომ ახალში განხორციელებული ცვლილებები გავლენას ახდენს როგორც Apache-დან, ასევე ბრძანების ხაზიდან სკრიპტების გაშვებაზე.

დანილო ივანოვი [დოსიე]ჯობია ფაილის შექმნა დაწკაპუნებით

და გახსენით იგი თქვენი ბრაუზერის საშუალებით.
და შემდეგ გაუშვით php -i | grep ini და შეცვალეთ გზა php.ini-ზე ისე, როგორც თქვენ ჩამოტვირთავთ php-ს და არა მხოლოდ ფაილს დისკზე.

დანილო ივანოვი [დოსიე]რას ჰგავს php -i? ბინარს შეუძლია მოძებნოს კონფიგურაცია სხვა ადგილას, კომპილაციის პარამეტრების ქვეშ. ეს არ არის პირველი შემთხვევა, როდესაც ვხვდები იმ ფაქტს, რომ mod_php.dll და php.exe გავლენას ახდენს სხვადასხვა ფაილები და ის, ვინც მუშაობს ერთში, არ მუშაობს მეორეში.

ვასილ სვირიდოვი [დოსიე]
php -i ასე გამოიყურება:

კონფიგურაციის ფაილი (php.ini) გზა => C:\WINDOWS
ჩატვირთული კონფიგურაციის ფაილი => C:\PHP\php.ini

php.ini ფაილის Windows დირექტორიაში გადატანა სიტუაციას არ ცვლის.

დანილო ივანოვი [დოსიე]
რაც შეეხება სხვა მოდულებს? მაგალითად php_mysql??? დაკავშირება? რატომ არის cURL ასეთი საზიზღარი?

ჰმ, ვერ შევაწუხებ... სულ სხვა კონფიგურაციაზე (Apache 2.2 პლუს PHP 5.1.6 Zend-studio-ს ქვეშ). ალე, ეს არ არის მთავარი. ექსპერიმენტი Apache-ს ბრძანების ხაზიდან (უფრო ზუსტად, FAR-დან) გაშვებით, რომელიც აჩვენებს წიქავას. კურლოვის დაკავშირების მცდელობის გარეშე, ყველაფერი თაიგულად იწყება. როდესაც თქვენ ცდილობთ დაკავშირებას, კურლოვი ხედავს შეცდომას ... php5ts.dll-ში.

გამარჯობა!
ანალოგიური პრობლემა მაქვს ვინდოუს ტელეფონზე, დიდი ხნის ძებნის მერე კიდევ დავდე ახალი ვერსია PNR, ამ ფორუმის ცოდნის შედეგად. აქ გადაწყვეტილება არ იყო, ამიტომ მე თვითონ ვცადე.

ზენდას სტუდია მოვაწყე და მის წინ მეტი იყო ადრეული ვერსია RNR. შესაძლებელია, რომ მათგან საკუთარი ბიბლიოთეკების დამონტაჟებით, იქ სუნი დაიკარგა - ისინი მოძველდნენ.

ამის გულისთვის განსაკუთრებით ბოლო „ნეხსბი“. მივედი C:\windows\system32-ზე და აღმოვაჩინე, რომ libeay32.dll და ssleay32.dll ბიბლიოთეკები არ ემთხვევა ორიგინალ ზომებს. მემქეშიდი დავაყენე, ალბათ ბოლოს და ბოლოს. მაშ, რა დაამატე, 32 სისტემაში წადი :)

იგივე პრობლემა აქვს Vinikla-ს, php -i | ბრძანებით მოვაგვარე grep ini
აჩვენა, რომ zlib1.dll ბიბლიოთეკა არ იტვირთება
Apache-ის საქაღალდეში მან დაწერა ასლი საქაღალდეში PHP-ით
ბრძანების გამეორებით, მან აჩვენა, რომ zlib.dll ბიბლიოთეკა არ იტვირთება, ჩაწერა Apache საქაღალდეში და მოითხოვა ყველაფერი.
და ყველა ბიბლიოთეკა კვლავ შეიცავს php5ts.dll, ასე რომ დარწმუნდით, რომ გაქვთ ყველა საჭირო ბიბლიოთეკა.

გთხოვთ დაასრულოთ წერა. ასე რომ, მე უკვე წავაწყდი ამ პრობლემას. მე მივაღწიე ამ ფორუმს სხვა საიტზე გაგზავნილი შეტყობინების საშუალებით. ყველა ჩამოთვლილი ვარიანტი სხვა არაფერია, თუ არა პოლიცია. გადაწყვეტილების არსი Windows-ში. თქვენ უნდა დაარეგისტრიროთ PATH ცვლილება. შეიყვანეთ იქ, სადაც იცით, რომ გაქვთ PHP. და Hallelujah curl ვერ ხედავს წყალობას. სხვა ბიბლიოთეკების მსგავსად...

მათ, ვინც იყენებს cURL-ს, 5.6.1, 5.5.17-ზე განახლების შემდეგ აღმოაჩინა, რომ cURL მოდულმა შეწყვიტა მუშაობა. მას შემდეგ პრობლემა არ გაჩენილა. PHP 5.6.4-ის დღევანდელი ვერსიით, ეს პრობლემა შენარჩუნებულია.

როგორ შეგიძლიათ გაიგოთ რას აკეთებს თქვენი cURL?

შექმნა php ფაილიდა დააკოპირეთ აქ:

განბლოკეთ იგი სერვერიდან. რა არის გამოსავალი სკრიპტზე:

მასივი (=> 468736 => 3 => 3997 => 0 => 7.39.0 => x86_64-pc-win32 => OpenSSL / 1.0.1j => 1.2.7.3 => მასივი (=> dict => ფაილი => ftp => ftps => gopher => http => https => imap => imaps => ldap => pop3 => pop3s => rtsp => scp => sftp => smtp => smtps => telnet => tftp) )

ეს ნიშნავს, რომ cURL-ით ყველაფერი კარგადაა, რადგან ის ჩანაცვლებულია PHP-ით, რაც ნიშნავს, რომ პრობლემა გაქრა.

უპირველეს ყოვლისა, შეამოწმეთ php.ini ფაილი და იპოვეთ იქ ხაზი

გაფართოება = php_curl.dll

და გადაიფიქრე ისე, რომ მის წინ ლაქა არ დარჩეს.

თუ ყველაფერი ასეა, მაგრამ cURL არ მუშაობს, მაშინ შეიძლება კიდევ ერთი ტესტის ჩატარება სიტუაციის არაგადაუდებელობის დასადასტურებლად. შექმენით სხვა php ფაილი ნაცვლად:

ბრაუზერში ძიებით შეგიძლიათ იპოვოთ cURL, რაც ნიშნავს, რომ cURL მოდული არ არის საჭირო:

ამ შემთხვევაში, Apache და PHP მუშაობს ისე, როგორც მოსალოდნელია.

გადაწყვეტილება სამი:

  1. პირველი მეთოდი (არა კოშერი). თუ გაქვთ PHP 5.6. * შემდეგ აიღეთ PHP 5.6.0 ვერსია, შემდეგ აიღეთ ძველი ფაილი php_curl.dll და შეცვალეთ იგი თქვენი ახლით ვერსიით, მაგალითად, PHP 5.6.4. ვისაც აქვს PHP 5.5.17 და უფრო მაღალი, თქვენ უნდა აიღოთ იგივე ფაილი PHP 5.5.16-დან და ასევე შეცვალოთ იგი. მხოლოდ ერთი პრობლემაა - იცოდე ეს ძველი ვერსიები. თქვენ, რა თქმა უნდა, შეგიძლიათ იხილოთ http://windows.php.net/downloads/snaps/php-5.6, თორემ განსაკუთრებით არ ვიცი რა მჭირდება იქ. იგივე გადაწყვეტილება არ არის მთლიანად კოშერი.
  2. მეთოდი განსხვავებულია (კიდევ უფრო სწრაფი, მაგრამ არა კოშერი). PHP დირექტორიადან დააკოპირეთ libssh2.dll ფაილი Apache24bin დირექტორიაში და გადატვირთეთ Apache.
  3. მეთოდი მესამე (კოშერი - კოშერი ხალხი ფეხზე დგას). თქვენ უნდა დაამატოთ თქვენი PHP დირექტორია PATH-ში. როგორ გავაკეთოთ ეს ნათლად არის ასახული ოფიციალურ დოკუმენტაციაში.

მოდით შევამოწმოთ:

Voila, cURL განყოფილება არის საიტზე.

Რატომ ასე? ვარსკვლავებს ჰქონდათ პრობლემა? ამ თემაზე არანაირი მტკიცებულება არ არსებობს, თუმცა მექანიზმის აღწერა არ არსებობს.

პრობლემა დაკავშირებულია იმასთან, რომ libcurl 7.38.0 განახლების შეცდომის ბრალია 5.6.1. თუმცა, გაუგებარია, რომ PHP ავტორები მიუთითებენ Apache-ზე და ამბობენ, რომ იქ არის შეცდომები.

პრობლემის მექანიზმი: თუ სისტემის PATH არ შეიცავს PHP დირექტორიას, მაშინ როდესაც Apache სერვისი იწყება, ის ვერ პოულობს ახალ dll-ს (libssh2.dll), რომელიც შეიცავს php_curl-ს.

მიმდინარე ხარვეზების შესახებ ანგარიშები:

ფატალური შეცდომა: გამოძახება დაუზუსტებელ ფუნქციაზე curl_multi_init()-ში ...

სინამდვილეში, PHP-ში cURL-თან დაკავშირებული პრობლემები, როგორც ჩანს, ხდება არა ყოველთვის, არამედ უფრო ხშირად. ჩემი პრობლემის გუგლის დროს, მე წავაწყდი ათზე მეტ პრობლემას.

რა თქმა უნდა, გუგლინგმა კიდევ რამდენიმე სიტყვა გამოიღო:

ინტერნეტში შეგიძლიათ იპოვოთ „ინსტრუქციები იდიოტებისთვის“, რომლებშიც მოხსენებები, სურათებით, აჩვენებს, თუ როგორ უნდა აიხსნას ხაზის გაფართოება = php_curl.dll php.ini ფაილში.

ოფიციალურ PHP ვებსაიტზე, cURL ინსტალაციის განყოფილებაში, Windows სისტემის მხოლოდ ორი ვარიანტია:

რობოტებისთვის cym მოდულით Windows ფაილები libeay32.dll და ssleay32.dll არის დამნაშავე სისტემის PATH-ში. თქვენ არ გჭირდებათ libcurl.dll ფაილი cURL საიტიდან.

ათჯერ წავიკითხე ისინი. გადართვაზე ინგლისური ენადა კიდევ რამდენჯერმე წავიკითხე ინგლისური. ყოველ ჯერზე უფრო და უფრო მეტად ვურთიერთობთ იმ ფაქტთან, რომ ეს ორი წინადადება დაწერილია არსებების მიერ და თუნდაც კლავიატურაზე მხოლოდ კონდახი დავწერო, არ მესმის მათი ცვლილება.

ასევე ბევრია ღვთისგან ბოძებული სიხარული და მითითება (რომლის ცდაც შევძელი).

PHP შეცდომების მოხსენების საიტზე, მე უკვე მივედი დასკვნამდე, რომ PHP დირექტორია უნდა შევიტანო სისტემის PATH ცვლილებაში.

სხვათა შორის, მათთვის, ვისაც პრობლემა აქვს cURL-თან და ვისაც უნდა „ჩართოს დირექტორია PHP სისტემაში PATH change“, გადადით უკვე აღნიშნულ ინსტრუქციებზე http://php.net/manual/ru/faq.installation. .php#faq install.addtopath. იქ ყველაფერი მარტივია, მაგრამ, ჩემი აზრით, ადამიანურ ენაზე წერია, რომ ფულის შოვნა გჭირდებათ.