Kumpulan tips dan fakta optimasi script PHP. Mempertajam keterampilan Anda dengan cURL Beberapa kata tentang opsi cURL berguna lainnya

Cara mencari yang benar menggunakan google.com

Semua orang mungkin tahu cara menggunakan ini mesin pencari, seperti Google =) Tetapi tidak semua orang tahu bahwa jika Anda menyusun permintaan pencarian dengan benar menggunakan konstruksi khusus, Anda dapat mencapai hasil yang Anda cari dengan lebih efisien dan cepat =) Pada artikel ini saya akan mencoba menunjukkan apa dan bagaimana yang perlu Anda lakukan agar pencarian benar

Google mendukung beberapa operator pencarian lanjutan yang memiliki arti khusus ketika mencari di google.com. Biasanya, operator ini mengubah pencarian, atau bahkan meminta Google untuk melakukannya sepenuhnya berbagai jenis mencari. Misalnya saja desainnya link: adalah operator khusus, dan permintaan tautan:www.google.com tidak akan memberi Anda penelusuran biasa, melainkan akan menemukan semua laman web yang memiliki tautan ke google.com.
jenis permintaan alternatif

cache: Jika Anda memasukkan kata lain dalam kueri Anda, Google akan menyorot kata-kata yang disertakan tersebut dalam dokumen cache.
Misalnya, cache:www.situs web akan menampilkan konten cache dengan kata "web" yang disorot.

link: Permintaan pencarian di atas akan menampilkan halaman web yang berisi link ke permintaan yang ditentukan.
Misalnya: tautan:www.situs akan menampilkan semua halaman yang memiliki link ke http://www.site

terkait: Menampilkan halaman web yang “terkait” dengan halaman web tertentu.
Misalnya, terkait: www.google.com akan mencantumkan halaman web yang serupa halaman rumah Google.

informasi: Informasi Kueri: akan menyajikan beberapa informasi yang dimiliki Google tentang halaman web yang Anda minta.
Misalnya, info: situs web akan menampilkan informasi tentang forum kami =) (Armada - Forum Webmaster Dewasa).

Permintaan informasi lainnya

mendefinisikan: Define: query akan memberikan definisi kata-kata yang Anda masukkan setelahnya, dikumpulkan dari berbagai sumber online. Definisinya adalah untuk seluruh frasa yang dimasukkan (yaitu, mencakup semua kata dalam kueri yang sama persis).

saham: Jika Anda memulai kueri dengan saham: Google akan memproses sisa istilah kueri sebagai simbol saham, dan menautkan ke halaman yang menampilkan informasi siap pakai untuk simbol tersebut.
Misalnya, saham:Intel yahoo akan menampilkan informasi tentang Intel dan Yahoo. (Perhatikan bahwa Anda harus mengetikkan simbol berita terkini, bukan nama perusahaan)

Pengubah Kueri

lokasi: Jika Anda menyertakan site: dalam kueri Anda, Google akan membatasi hasilnya hanya pada situs web yang ditemukan di domain tersebut.
Anda juga dapat mencari berdasarkan zona individual, seperti ru, org, com, dll ( situs:com situs:ru)

semua judul: Jika Anda menjalankan kueri dengan allintitle:, Google akan membatasi hasil pada semua kata kueri di judul.
Misalnya, semua judul: pencarian Google akan mengembalikan semua halaman Google berdasarkan pencarian seperti gambar, Blog, dll

judul: Jika Anda menyertakan intitle: dalam kueri Anda, Google akan membatasi hasilnya pada dokumen yang mengandung kata tersebut dalam judulnya.
Misalnya, judul:Bisnis

allinurl: Jika Anda menjalankan kueri dengan allinurl: Google akan membatasi hasil untuk semua kata kueri di URL.
Misalnya, allinurl: pencarian google akan mengembalikan dokumen dengan google dan mencari di judul. Selain itu, sebagai pilihan, Anda dapat memisahkan kata-kata dengan garis miring (/) lalu kata-kata di kedua sisi garis miring akan dicari dalam halaman yang sama: Contoh allinurl: foo/bar

inurl: Jika Anda menyertakan inurl: dalam kueri Anda, Google akan membatasi hasilnya pada dokumen yang berisi kata tersebut di URL.
Misalnya, Inurl animasi: situs

isi: hanya mencari kata tertentu dalam teks halaman, mengabaikan judul dan teks tautan, dan hal-hal lain yang tidak terkait. Ada juga turunan dari pengubah ini -. semua teks: itu. selanjutnya, semua kata dalam kueri akan dicari hanya di teks, yang juga penting, mengabaikan kata-kata yang sering digunakan di tautan
Misalnya, isi:forum

rentang tanggal: pencarian dalam jangka waktu (rentang tanggal:2452389-2452389), tanggal waktu ditunjukkan dalam format Julian.

Ya, dan segala macam hal lainnya contoh menarik permintaan

Contoh penulisan query untuk Google. Untuk spammer

Inurl:control.guest?a=tanda tangan

Situs:books.dreambook.com “URL Beranda” “Tanda tangan saya” inurl:tanda tangan

Situs: Beranda www.freegb.net

Inurl:sign.asp “Jumlah Karakter”

“Pesan:” inurl:sign.cfm “Pengirim:”

Inurl:register.php “Pendaftaran Pengguna” “Situs Web”

Inurl:edu/buku tamu “Tanda tangan Buku Tamu”

Inurl:posting “Posting Komentar” “URL”

Inurl:/archives/ “Komentar:” “Ingat infonya?”

“Naskah dan Buku Tamu Dibuat oleh:” “URL:” “Komentar:”

Inurl:?action=tambahkan “phpBook” “URL”

Judul:"Kirim Cerita Baru"

Majalah

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

Inurl terbesarjournal.com/mode=reply

Inurl:fastbb.ru/re.pl?

Inurl:fastbb.ru /re.pl? "Buku tamu"

Blog

Inurl:blogger.com/comment.g?”postID””anonim”

Inurl:typepad.com/ “Posting komentar” “Ingat info pribadi?”

Inurl:greatestjournal.com/community/ “Posting komentar” “alamat poster anonim”

“Posting komentar” “alamat poster anonim” -

Judul:"Posting komentar"

Inurl:pirillo.com “Posting komentar”

Forum

Inurl:gate.html?”nama=Forum” “mode=balas”

Inurl:”forum/posting.php?mode=balas”

Inurl:"mes.php?"

Inurl:”members.html”

Inurl:forum/memberlist.php?”

cURL adalah alat khusus yang dirancang untuk mentransfer file dan data menggunakan sintaks URL. Teknologi ini mendukung banyak protokol seperti HTTP, FTP, TELNET dan banyak lainnya. cURL awalnya dirancang untuk menjadi alat baris perintah. Beruntung bagi kami, perpustakaan cURL didukung oleh bahasanya Pemrograman PHP. Pada artikel ini kita akan melihat beberapa fitur lanjutan cURL dan juga penutupnya aplikasi praktis memperoleh pengetahuan dengan menggunakan PHP.

Mengapa keriting?

Faktanya, ada banyak cara-cara alternatif contoh konten halaman web. Dalam banyak kasus, terutama karena kemalasan, saya menggunakan PHP sederhana fungsi alih-alih cURL:

$isi = file_get_contents("http://www.nettuts.com"); // atau $lines = file("http://www.nettuts.com"); // atau readfile("http://www.nettuts.com");

Namun, fungsi-fungsi ini hampir tidak memiliki fleksibilitas dan mengandung banyak kekurangan dalam hal penanganan kesalahan, dll. Selain itu, ada tugas tertentu yang tidak dapat Anda selesaikan dengan fitur standar berikut: interaksi cookie, autentikasi, pengiriman formulir, pengunggahan file, dll.

cURL adalah perpustakaan canggih yang mendukung banyak protokol, opsi, dan penyediaan berbeda informasi rinci tentang permintaan URL.

Struktur dasar

  • Inisialisasi
  • Penetapan parameter
  • Eksekusi dan pengambilan hasil
  • Membebaskan memori

// 1. inisialisasi $ch = curl_init(); // 2. tentukan parameter, termasuk url curl_setopt($ch, CURLOPT_URL, "http://www.nettuts.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); // 3. dapatkan HTML sebagai hasilnya $output = curl_exec($ch); // 4. tutup koneksi curl_close($ch);

Langkah #2 (yaitu, memanggil curl_setopt()) akan dibahas lebih banyak di artikel ini daripada semua langkah lainnya, karena Pada tahap ini, semua hal paling menarik dan berguna yang perlu Anda ketahui terjadi. Di cURL ada sejumlah besar opsi berbeda yang harus ditentukan agar dapat mengonfigurasi permintaan URL dengan cara yang paling hati-hati. Kami tidak akan mempertimbangkan keseluruhan daftarnya, tetapi kami hanya akan fokus pada apa yang saya anggap perlu dan berguna untuk pelajaran ini. Anda dapat mempelajari semuanya sendiri jika topik ini menarik minat Anda.

Pemeriksaan Kesalahan

Selain itu, Anda juga bisa menggunakan pernyataan bersyarat untuk memeriksa keberhasilan operasi:

// ... $keluaran = curl_exec($ch); if ($output === FALSE) ( echo "Kesalahan cURL: " . curl_error($ch); ) // ...

Di sini saya meminta Anda untuk mencatat poin yang sangat penting: kita harus menggunakan “=== false” untuk perbandingan, bukan “== false”. Bagi yang belum mengetahuinya, ini akan membantu kita membedakan antara hasil kosong dan nilai boolean false, yang akan menunjukkan kesalahan.

Mendapatkan informasi

Langkah tambahan lainnya adalah mendapatkan data tentang permintaan cURL setelah dijalankan.

// ... curl_exec($ch); $info = curl_getinfo($ch); gema "Mengambil". $info["total_waktu"] . "detik untuk url". $info["url"]; //…

Array yang dikembalikan berisi informasi berikut:

  • "url"
  • "tipe_konten"
  • "http_kode"
  • “ukuran_tajuk”
  • “ukuran_permintaan”
  • "waktu file"
  • “ssl_verifikasi_hasil”
  • “pengalihan_hitungan”
  • “total_waktu”
  • “pencarian nama_waktu”
  • “waktu_sambungan”
  • “waktu_pratransfer”
  • “ukuran_unggah”
  • “ukuran_unduh”
  • “kecepatan_unduh”
  • “kecepatan_unggah”
  • “panjang_konten_unduh”
  • “panjang_unggahan_konten”
  • “waktu_mulaitransfer”
  • “waktu_pengalihan”

Deteksi pengalihan tergantung pada browser

Pada contoh pertama ini, kami akan menulis kode yang dapat mendeteksi pengalihan URL berdasarkan berbagai pengaturan browser. Misalnya, beberapa situs web mengalihkan browser ponsel, atau perangkat lainnya.

Kami akan menggunakan opsi CURLOPT_HTTPHEADER untuk menentukan header HTTP keluar kami, termasuk nama browser pengguna dan bahasa yang tersedia. Pada akhirnya kami akan dapat menentukan situs mana yang mengarahkan kami ke URL berbeda.

// uji URL $urls = array("http://www.cnn.com", "http://www.mozilla.com", "http://www.facebook.com"); // menguji browser $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)", "bahasa" => "en-us,en;q=0.5"), "iphone" => array ("user_agent" => "Mozilla/5.0 (iPhone; U ; CPU seperti Mac OS X; en) AppleWebKit/420+ (KHTML, seperti Gecko) Versi/3.0 Seluler/1A537a Safari/419.3", "bahasa" => "en"), "perancis" => array ("agen_pengguna" => "Mozilla/4.0 (kompatibel; MSIE 7.0; Windows NT 5.1; GTB6; .NET CLR 2.0.50727)", "bahasa" => "fr,fr-FR;q=0.5")); foreach ($urls sebagai $url) ( echo "URL: $url\n"; foreach ($browser sebagai $test_name => $browser) ( $ch = curl_init(); // tentukan url curl_setopt($ch, CURLOPT_URL , $url); // tentukan header untuk browser curl_setopt($ch, CURLOPT_HTTPHEADER, array("Agen-Pengguna: ($browser["agen_pengguna"])", "Bahasa yang Diterima: ($browser["bahasa"] )" )); // kita tidak memerlukan konten halaman curl_setopt($ch, CURLOPT_NOBODY, 1); // kita perlu mendapatkan header HTTP curl_setopt($ch, CURLOPT_HEADER, 1); // mengembalikan hasil, bukan output curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($ch); curl_close($ch); // apakah ada pengalihan HTTP? , $matches) ( echo " $test_name: dialihkan ke $matches\n"; ) else ( echo "$test_name: tidak ada pengalihan\n"; ) ) echo "\n\n";

Pertama, kita tentukan daftar URL situs yang akan kita periksa. Lebih tepatnya, kita memerlukan alamat situs-situs tersebut. Selanjutnya kita perlu menentukan pengaturan browser untuk menguji masing-masing URL ini. Setelah ini, kita akan menggunakan loop di mana kita akan memeriksa semua hasil yang diperoleh.

Trik yang kita gunakan dalam contoh ini untuk mengatur pengaturan cURL akan memungkinkan kita untuk mendapatkan bukan konten halaman, tapi hanya header HTTP (disimpan di $output). Selanjutnya, dengan menggunakan regex sederhana, kita dapat menentukan apakah string “Lokasi:” ada di header yang diterima.

Saat kamu berlari kode ini, Anda akan mendapatkan hasil seperti berikut:

Membuat permintaan POST ke URL tertentu

Saat terbentuk DAPATKAN permintaan Data yang dikirimkan dapat diteruskan ke URL melalui “string kueri”. Misalnya, saat Anda melakukan penelusuran Google, istilah penelusuran ditempatkan di bilah alamat URL baru:

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

Untuk melakukan simulasi permintaan ini, Anda tidak perlu menggunakan fasilitas cURL. Jika kemalasan benar-benar menguasai Anda, gunakan fungsi “file_get_contents()” untuk mendapatkan hasilnya.

Namun masalahnya adalah beberapa formulir HTML mengirimkan permintaan POST. Data formulir ini diangkut melalui badan permintaan HTTP, dan tidak seperti pada kasus sebelumnya. Misalnya, jika Anda mengisi formulir di forum dan mengklik tombol pencarian, kemungkinan besar permintaan POST akan dibuat:

Http://codeigniter.com/forums/do_search/

Kita bisa menulis skrip PHP, yang dapat mensimulasikan URL permintaan semacam ini. Pertama mari kita buat file sederhana untuk diterima dan ditampilkan data POSTING. Sebut saja post_output.php:

Cetak_r($_POST);

Kemudian kita membuat skrip PHP untuk membuat permintaan cURL:

$url = "http://localhost/post_output.php"; $post_data = array ("foo" => "bar", "query" => "Nettuts", "action" => "Kirim"); $ch = ikal_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // menunjukkan bahwa kita mempunyai permintaan POST curl_setopt($ch, CURLOPT_POST, 1); // menambahkan variabel curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); $keluaran = curl_exec($ch); curl_close($ch); gema $keluaran;

Saat Anda menjalankan skrip ini, Anda akan mendapatkan hasil seperti ini:

Dengan demikian, permintaan POST dikirim ke skrip post_output.php, yang pada gilirannya menghasilkan output susunan superglobal$_POST, konten yang kami peroleh menggunakan cURL.

Mengunggah file

Pertama, mari kita buat file untuk menghasilkannya dan mengirimkannya ke file upload_output.php:

Cetak_r($_FILES);

Dan berikut adalah kode skrip yang menjalankan fungsi di atas:

$url = "http://localhost/upload_output.php"; $post_data = array ("foo" => "bar", // file yang akan diunggah "upload" => "@C:/wamp/www/test.zip"); $ch = ikal_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); $keluaran = curl_exec($ch); curl_close($ch); gema $keluaran;

Saat Anda ingin mengupload file, yang harus Anda lakukan hanyalah meneruskannya sebagai variabel post biasa, diawali dengan simbol @. Saat Anda menjalankan skrip tertulis, Anda akan mendapatkan hasil sebagai berikut:

Beberapa ikal

Salah satu yang paling banyak kekuatan cURL adalah kemampuan untuk membuat "beberapa" penangan cURL. Ini memungkinkan Anda membuka koneksi ke beberapa URL secara bersamaan dan asinkron.

Dalam versi klasik permintaan cURL, eksekusi skrip ditangguhkan dan menunggu selesainya operasi URL permintaan, setelah itu skrip dapat dilanjutkan. Jika Anda ingin berinteraksi dengan sejumlah besar URL, ini akan memerlukan investasi waktu yang cukup besar, karena dalam versi klasik Anda hanya dapat bekerja dengan satu URL dalam satu waktu. Namun, kita dapat memperbaiki situasi ini dengan menggunakan penangan khusus.

Mari kita lihat contoh kode yang saya ambil dari php.net:

// membuat beberapa resource cURL $ch1 = curl_init(); $ch2 = ikal_init(); // tentukan URL dan parameter lainnya 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); //membuat beberapa pengendali cURL $mh = curl_multi_init(); //tambahkan beberapa penangan curl_multi_add_handle($mh,$ch1); curl_multi_add_handle($mh,$ch2); $aktif = nol; //jalankan lakukan ( $mrc ​​​​= curl_multi_exec($mh, $aktif); ) while ($mrc == CURLM_CALL_MULTI_PERFORM); while ($aktif && $mrc ​​​​== CURLM_OK) ( if (curl_multi_select($mh) != -1) ( lakukan ( $mrc ​​​​= curl_multi_exec($mh, $aktif); ) while ($mrc == CURLM_CALL_MULTI_PERFORM); ) ) //menutup curl_multi_remove_handle($mh, $ch1); curl_multi_remove_handle($mh, $ch2); curl_multi_close($mh);

Idenya adalah Anda dapat menggunakan beberapa penangan cURL. Dengan menggunakan loop sederhana, Anda dapat melacak permintaan mana yang belum diselesaikan.

Ada dua loop utama dalam contoh ini. Pertama perulangan do-sementara memanggil fungsi curl_multi_exec(). Fungsi ini tidak dapat diblokir. Ini berjalan secepat mungkin dan mengembalikan status permintaan. Selama nilai yang dikembalikan adalah konstanta 'CURLM_CALL_MULTI_PERFORM', ini berarti pekerjaan belum selesai (misalnya, pada saat ini pengiriman sedang berlangsung header http di URL); Itu sebabnya kami terus memeriksa nilai pengembalian ini hingga kami mendapatkan hasil yang berbeda.

Pada loop berikutnya kita memeriksa kondisi sementara variabel $aktif = "benar". Ini adalah parameter kedua dari fungsi curl_multi_exec(). Nilai variabel ini akan sama dengan "benar" sampai salah satu darinya perubahan yang ada aktif. Selanjutnya kita memanggil fungsi curl_multi_select(). Eksekusinya "diblokir" selama setidaknya ada satu koneksi aktif, hingga respons diterima. Ketika ini terjadi, kita kembali ke loop utama untuk melanjutkan mengeksekusi query.

Sekarang mari kita terapkan pengetahuan ini pada sebuah contoh yang akan sangat berguna bagi banyak orang.

Memeriksa tautan di WordPress

Bayangkan sebuah blog dengan banyak postingan dan pesan, yang masing-masing berisi link ke sumber daya Internet eksternal. Beberapa tautan ini mungkin sudah mati karena berbagai alasan. Halaman tersebut mungkin telah dihapus atau situs mungkin tidak berfungsi sama sekali.

Kami akan membuat skrip yang akan menganalisis semua tautan dan menemukan situs web yang tidak dapat dimuat dan halaman 404, lalu memberi kami laporan terperinci.

Izinkan saya segera mengatakan bahwa ini bukan contoh membuat plugin untuk WordPress. Ini benar-benar merupakan ajang pengujian yang bagus untuk pengujian kami.

Mari kita mulai. Pertama kita perlu mengambil semua link dari database:

// konfigurasi $db_host = "localhost"; $db_pengguna = "akar"; $db_pass = ""; $db_nama = "wordpress"; $excluded_domains = array("localhost", "www.domainku.com"); $max_koneksi = 10; // inisialisasi variabel $url_list = array(); $working_urls = susunan(); $dead_urls = susunan(); $not_found_urls = susunan(); $aktif = nol; // sambungkan ke MySQL if (!mysql_connect($db_host, $db_user, $db_pass)) ( die("Tidak dapat terhubung: " . mysql_error()); ) if (!mysql_select_db($db_name)) ( die("Bisa jangan pilih db: " . mysql_error()); ) // pilih semua postingan yang dipublikasikan dengan tautan $q = "PILIH post_content FROM wp_posts WHERE post_content LIKE "%href=%" AND post_status = "publish" AND post_type = "post" " ; $r = mysql_query($q) atau mati(mysql_error()); while ($d = mysql_fetch_assoc($r)) ( // ambil tautan menggunakan ekspresi reguler if (preg_match_all("!href=\"(.*?)\"!", $d["post_content"], $matches)) ( foreach ($cocok sebagai $url) ( $tmp = parse_url($url) ; if (in_array($tmp["host"], $excluded_domains)) ( lanjutkan; ) $url_list = $url; ) ) // hapus duplikat $url_list = array_values(array_unique($url_list)); if (!$url_list) ( die("Tidak ada URL yang perlu diperiksa"); )

Pertama, kami membuat data konfigurasi untuk interaksi dengan database, lalu kami menulis daftar domain yang tidak akan berpartisipasi dalam pemeriksaan ($excluded_domains). Kami juga menentukan angka yang mencirikan jumlah koneksi simultan maksimum yang akan kami gunakan dalam skrip kami ($max_connections). Kami kemudian bergabung dengan database, memilih postingan yang berisi link, dan mengumpulkannya ke dalam array ($url_list).

Kode berikut agak rumit, jadi pelajari dari awal sampai akhir:

// 1. pengendali ganda $mh = curl_multi_init(); // 2. tambahkan satu set URL untuk ($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; } }

Disini saya akan mencoba menjelaskan semuanya secara detail. Nomor di daftar sesuai dengan nomor di komentar.

  1. 1. Buat beberapa penangan;
  2. 2. Kita akan menulis fungsi add_url_to_multi_handle() nanti. Setiap kali dipanggil, pemrosesan url baru akan dimulai. Awalnya, kami menambahkan 10 ($max_connections) URL;
  3. 3. Untuk memulai, kita harus menjalankan fungsi curl_multi_exec(). Selama ia mengembalikan CURLM_CALL_MULTI_PERFORM, masih ada yang harus kami lakukan. Kami membutuhkan ini terutama untuk menciptakan koneksi;
  4. 4. Berikutnya adalah loop utama, yang akan berjalan selama kita memiliki setidaknya satu koneksi aktif;
  5. 5. curl_multi_select() hang menunggu pencarian URL selesai;
  6. 6. Sekali lagi, kita perlu mendapatkan cURL untuk melakukan beberapa pekerjaan, yaitu mengambil data respon pengembalian;
  7. 7. Informasi diverifikasi di sini. Sebagai hasil dari mengeksekusi permintaan, sebuah array akan dikembalikan;
  8. 8. Array yang dikembalikan berisi pengendali cURL. Kami akan menggunakannya untuk memilih informasi tentang permintaan cURL terpisah;
  9. 9. Jika link sudah mati, atau waktu skrip habis, maka kita tidak perlu mencari kode http apa pun;
  10. 10. Jika link tersebut mengembalikan halaman 404 kepada kita, maka kode http akan berisi nilai 404;
  11. 11. Jika tidak, kami memiliki tautan yang berfungsi di depan kami. (Anda dapat menambahkan pemeriksaan tambahan untuk kode kesalahan 500, dll...);
  12. 12. Selanjutnya kita hapus cURL handler karena sudah tidak diperlukan lagi;
  13. 13. Sekarang kita dapat menambahkan url lain dan menjalankan semua yang kita bicarakan sebelumnya;
  14. 14. Pada langkah ini, skrip menyelesaikan pekerjaannya. Kami dapat menghapus semua yang tidak kami perlukan dan membuat laporan;
  15. 15. Terakhir, kita akan menulis fungsi yang akan menambahkan url ke handler. Variabel statis $index akan bertambah setiap kali fungsi ini dipanggil.

Saya menggunakan skrip ini di blog saya (dengan beberapa tautan rusak yang saya tambahkan sengaja untuk mengujinya) dan mendapatkan hasil sebagai berikut:

Dalam kasus saya, skrip memerlukan waktu kurang dari 2 detik untuk merayapi 40 URL. Peningkatan kinerja sangat signifikan ketika bekerja dengan lebih banyak URL. Jika Anda membuka sepuluh koneksi secara bersamaan, skrip dapat dijalankan sepuluh kali lebih cepat.

Beberapa kata tentang opsi cURL berguna lainnya

Otentikasi HTTP

Jika aktif Alamat URL Jika Anda memiliki otentikasi HTTP, Anda dapat dengan mudah menggunakan skrip berikut:

$url = "http://www.somesite.com/members/"; $ch = ikal_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // tentukan nama pengguna dan kata sandi curl_setopt($ch, CURLOPT_USERPWD, "nama pengguna saya: kata sandi saya"); // jika pengalihan diperbolehkan curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // lalu simpan data kita di cURL curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1); $keluaran = curl_exec($ch); curl_close($ch);

Unggahan FTP

PHP juga memiliki perpustakaan untuk bekerja dengan FTP, tetapi tidak ada yang menghalangi Anda untuk menggunakan alat cURL di sini:

// buka file $file = fopen("/path/ke/file", "r"); // url harus berisi konten berikut $url = "ftp://namapengguna: [dilindungi email]:21/jalur/ke/baru/file"; $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")); // tentukan mode ASCII curl_setopt($ch, CURLOPT_FTPASCII, 1); ); curl_close($ch);

Menggunakan Proksi

Anda dapat melakukan permintaan URL melalui proxy:

$ch = ikal_init(); curl_setopt($ch, CURLOPT_URL,"http://www.example.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // tentukan alamat curl_setopt($ch, CURLOPT_PROXY, "11.11.11.11:8080"); // jika Anda perlu memberikan nama pengguna dan kata sandi curl_setopt($ch, CURLOPT_PROXYUSERPWD,"user:pass"); $keluaran = curl_exec($ch); curl_close($ch);

Fungsi panggilan balik

Dimungkinkan juga untuk menentukan fungsi yang akan dipicu bahkan sebelum permintaan cURL selesai. Misalnya, saat konten respons sedang dimuat, Anda dapat mulai menggunakan data tanpa menunggu hingga konten dimuat sepenuhnya.

$ch = ikal_init(); curl_setopt($ch, CURLOPT_URL,"http://net.tutsplus.com"); curl_setopt($ch, CURLOPT_WRITEFUNCTION,"fungsi_kemajuan"); curl_exec($ch); curl_close($ch); fungsi kemajuan_fungsi($ch,$str) ( echo $str; return strlen($str); )

Fungsi seperti ini HARUS mengembalikan panjang string, yang merupakan persyaratan.

Kesimpulan

Hari ini kita mempelajari bagaimana Anda dapat menggunakan perpustakaan cURL untuk tujuan egois Anda sendiri. Saya harap Anda menikmati artikel ini.

Terima kasih! Semoga harimu menyenangkan!

Jadi, sekarang saya akan memberi tahu Anda cara meretas sesuatu tanpa pengetahuan khusus. Saya akan segera mengatakan bahwa hanya ada sedikit manfaat dari ini, tapi tetap saja.
Pertama, Anda perlu menemukan situsnya sendiri. Untuk melakukan ini, buka google.com dan cari 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- Pertanyaan-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: berita.php?id= inurl:avd_start.php?avd= inurl:event.php?id= inurl:produk-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:peserta.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 :produk.php?id= inurl:releases.php?id= inurl:ray.php?id= inurl:produit.php?id= inurl:pop.php?id= inurl:shopping.php?id= inurl:detail produk .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:umumkan .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: penawaran.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"

ini daftar kecilnya. Anda dapat menggunakan milik Anda. Jadi, kami menemukan situsnya. Misalnya http://www.vestitambov.ru/
Selanjutnya, unduh program ini

**Konten Tersembunyi: Untuk melihat konten tersembunyi ini, jumlah postingan Anda harus 3 atau lebih.**

Klik Oke. Kemudian kita masukkan situs korban.
Kami menekan mulai. Selanjutnya kita tunggu hasilnya.
Jadi, program ini menemukan kerentanan SQL.

Selanjutnya, unduh Havij, http://www.vestitambov.ru:80/index.php?module=group_programs&id_gp= tempel tautan yang diterima di sana. Saya tidak akan menjelaskan cara menggunakan Havij dan di mana mendownloadnya; tidak sulit menemukannya. Semua. Anda telah menerima data yang Anda perlukan - kata sandi administrator, dan terserah imajinasi Anda.

P.S. Ini adalah upaya pertama saya untuk menulis sesuatu. Maaf jika ada yang salah

Artikel ini seharusnya sudah ditulis ulang sejak lama (terlalu banyak “menghemat pertandingan”), tetapi saya tidak pernah sempat melakukannya. Biarlah hal itu membebani dan mengingatkan kita betapa bodohnya kita di masa muda.
Salah satu kriteria utama keberhasilan sumber daya Internet apa pun adalah kecepatan kerjanya, dan setiap tahun pengguna menjadi semakin menuntut kriteria ini. Mengoptimalkan pengoperasian skrip PHP adalah salah satu metode untuk memastikan kecepatan sistem.
Pada artikel kali ini, saya ingin menyajikan kepada publik kumpulan tips dan fakta saya tentang optimasi skrip. Koleksinya membutuhkan waktu yang cukup lama untuk saya kumpulkan dan didasarkan pada beberapa sumber dan eksperimen pribadi.
Mengapa kumpulan tips dan fakta, bukan aturan ketat? Karena, seperti yang saya lihat, tidak ada “optimasi yang benar-benar tepat”. Banyak teknik dan aturan yang saling bertentangan dan tidak mungkin untuk mengikuti semuanya. Anda harus memilih serangkaian metode yang dapat diterima untuk digunakan tanpa mengorbankan keamanan dan kenyamanan. Saya telah mengambil posisi rekomendasi dan oleh karena itu saya memiliki saran dan fakta yang mungkin Anda ikuti atau tidak.
Untuk menghindari kebingungan, saya membagi semua tips dan fakta menjadi 3 kelompok:

  • Pengoptimalan kode
  • Pengoptimalan yang tidak berguna
Kelompok-kelompok tersebut ditetapkan secara kondisional dan beberapa item dapat dikaitkan dengan beberapa item sekaligus. Angka tersebut untuk server rata-rata (LAMP). Artikel ini tidak membahas isu-isu terkait efektivitas berbagai teknologi dan kerangka kerja pihak ketiga, karena ini adalah topik untuk diskusi terpisah.

Optimalisasi pada tingkat logika aplikasi dan organisasi

Banyak tips dan fakta terkait grup optimasi ini yang sangat signifikan dan memberikan keuntungan waktu yang sangat besar.
  • Profil kode Anda secara konstan di server (xdebug) dan klien (firebug) untuk mengidentifikasi kemacetan kode
    Perlu dicatat bahwa bagian server dan klien perlu diprofilkan, karena tidak semua kesalahan server dapat dideteksi di server itu sendiri.
  • Jumlah fungsi pengguna yang digunakan dalam program tidak mempengaruhi kecepatan sama sekali
    Hal ini memungkinkan program untuk menggunakan fungsi khusus yang tak terhitung jumlahnya.
  • Manfaatkan fitur khusus secara aktif
    Efek positif dicapai karena fakta bahwa operasi di dalam fungsi hanya dilakukan dengan variabel lokal. Dampaknya lebih besar dibandingkan biaya pemanggilan fungsi khusus.
  • Dianjurkan untuk mengimplementasikan fungsi “sangat berat” dalam bahasa pemrograman pihak ketiga dalam bentuk ekstensi PHP
    Hal ini memerlukan keterampilan pemrograman dalam bahasa pihak ketiga, yang secara signifikan meningkatkan waktu pengembangan, namun pada saat yang sama memungkinkan penggunaan teknik di luar kemampuan PHP.
  • Memproses file html statis lebih cepat daripada file php yang diinterpretasikan
    Perbedaan waktu pada klien bisa sekitar 1 detik, jadi masuk akal untuk memisahkan halaman statis dengan jelas dari halaman yang dihasilkan oleh alat PHP.
  • Ukuran file yang diproses (terhubung) mempengaruhi kecepatan
    Sekitar 0,001 detik dihabiskan untuk memproses setiap 2 KB. Fakta ini mendorong kami untuk meminimalkan kode skrip saat mentransfernya ke server produksi.
  • Cobalah untuk tidak menggunakan require_once atau include_once sepanjang waktu
    Fungsi-fungsi ini harus digunakan jika memungkinkan untuk membaca file lagi; dalam kasus lain, disarankan untuk menggunakan require dan include .
  • Pada saat melakukan percabangan suatu algoritma, jika ada konstruksi yang tidak dapat diproses dan volumenya sekitar 4 KB atau lebih, maka lebih optimal untuk memasukkannya menggunakan include.
  • Disarankan untuk menggunakan verifikasi data yang dikirim pada klien
    Hal ini disebabkan oleh fakta bahwa ketika memeriksa data di sisi klien, jumlah permintaan dengan data yang salah berkurang tajam. Sistem validasi data sisi klien dibangun terutama menggunakan JS dan elemen formulir kaku (pilih).
  • Dianjurkan untuk membangun struktur DOM yang besar untuk array data pada klien
    Ini sangat metode yang efektif optimasi saat bekerja dengan tampilan volume besar data. Esensinya adalah sebagai berikut: array data disiapkan di server dan ditransfer ke klien, dan konstruksi struktur DOM disediakan untuk fungsi JS. Akibatnya, sebagian beban didistribusikan kembali dari server ke klien.
  • Sistem yang dibangun menggunakan teknologi AJAX jauh lebih cepat dibandingkan sistem yang tidak menggunakan teknologi ini
    Hal ini disebabkan oleh penurunan volume keluaran dan redistribusi beban pada klien. Dalam praktiknya, kecepatan sistem dengan AJAX 2-3 kali lebih tinggi. Komentar: AJAX, pada gilirannya, menciptakan sejumlah batasan pada penggunaan metode optimasi lainnya, misalnya bekerja dengan buffer.
  • Saat menerima permintaan kiriman, selalu kembalikan sesuatu, bahkan mungkin spasi
    Jika tidak, klien akan dikirimi halaman kesalahan yang beratnya beberapa kilobyte. kesalahan ini sangat umum dalam sistem yang menggunakan teknologi AJAX.
  • Mengambil data dari file lebih cepat dibandingkan dari database
    Hal ini sebagian besar disebabkan oleh biaya koneksi ke database. Yang mengejutkan saya, sebagian besar pemrogram secara gila-gilaan menyimpan semua data dalam database, meskipun penggunaan file lebih cepat dan nyaman. Komentar: Anda dapat menyimpan data dalam file yang tidak dicari; jika tidak, Anda harus menggunakan database.
  • Jangan terhubung ke database kecuali diperlukan
    Untuk alasan yang tidak saya ketahui, banyak pemrogram yang terhubung ke database pada tahap membaca pengaturan, meskipun mereka mungkin tidak membuat pertanyaan ke database nanti. Ini adalah kebiasaan buruk yang memakan waktu rata-rata 0,002 detik.
  • Gunakan koneksi persisten ke database ketika ada sejumlah kecil klien yang aktif secara bersamaan
    Manfaat waktu karena kurangnya biaya untuk menghubungkan ke database. Perbedaan waktunya kurang lebih 0,002 detik. Komentar: pada dalam jumlah besar Tidak disarankan bagi pengguna untuk menggunakan koneksi persisten. Saat bekerja dengan koneksi persisten, harus ada mekanisme untuk mengakhiri koneksi.
  • Menggunakan kueri database yang kompleks lebih cepat daripada menggunakan beberapa kueri database sederhana
    Perbedaan waktu bergantung pada banyak faktor (volume data, pengaturan database, dll.) dan diukur dalam seperseribu, dan terkadang bahkan seperseratus detik.
  • Penggunaan perhitungan pada sisi DBMS lebih cepat dibandingkan perhitungan pada sisi PHP untuk data yang disimpan pada database
    Hal ini disebabkan oleh fakta bahwa perhitungan seperti itu di sisi PHP memerlukan dua query ke database (menerima dan mengubah data). Perbedaan waktu bergantung pada banyak faktor (volume data, pengaturan database, dll.) dan diukur dalam seperseribu dan seperseratus detik.
  • Jika data sampel dari database jarang berubah dan banyak pengguna mengakses data ini, maka masuk akal untuk menyimpan data sampel ke file
    Misalnya, Anda dapat menggunakan pendekatan sederhana berikut: kita mengambil data sampel dari database dan menyimpannya sebagai array serial ke file, lalu setiap pengguna menggunakan data dari file tersebut. Dalam praktiknya, metode pengoptimalan ini dapat meningkatkan kecepatan eksekusi skrip secara signifikan. Komentar: Saat menggunakan metode ini diperlukan untuk menulis alat untuk menghasilkan dan mengubah data dalam file yang disimpan.
  • Data cache yang jarang berubah dengan memcached
    Perolehan waktu bisa sangat signifikan. Komentar: Caching efektif untuk data statis; untuk data dinamis, efeknya berkurang dan mungkin negatif.
  • Bekerja tanpa objek (tanpa OOP) sekitar tiga kali lebih cepat dibandingkan bekerja dengan objek
    Lebih banyak memori juga dikonsumsi. Sayangnya, interpreter PHP tidak dapat bekerja dengan OOP secepat fungsi biasa.
  • Semakin besar dimensi array, semakin lambat kerjanya
    Pemborosan waktu terjadi karena penanganan struktur bersarang.

Pengoptimalan kode

Kiat dan fakta ini memberikan peningkatan kecepatan yang tidak signifikan dibandingkan kelompok sebelumnya, namun jika digabungkan, teknik ini dapat memberikan peningkatan waktu yang baik.
  • echo dan print jauh lebih cepat daripada printf
    Perbedaan waktunya bisa mencapai seperseribu detik. Hal ini karena printf digunakan untuk mengeluarkan data yang diformat dan penerjemah memeriksa seluruh baris untuk data tersebut. printf hanya digunakan untuk mengeluarkan data yang perlu diformat.
  • echo $var."text" lebih cepat dari echo "$var text"
    Hal ini karena mesin PHP pada kasus kedua terpaksa mencari variabel di dalam string. Untuk data dalam jumlah besar dan lama versi PHP perbedaan dari waktu ke waktu terlihat jelas.
  • echo "a" lebih cepat dari echo "a" untuk string tanpa variabel
    Hal ini karena dalam kasus kedua mesin PHP sedang mencoba mencari variabel. Untuk data dalam jumlah besar, perbedaan waktu cukup mencolok.
  • echo "a","b" lebih cepat dari echo "a"."b"
    Menghasilkan data yang dipisahkan dengan koma lebih cepat dibandingkan dengan titik. Hal ini karena pada kasus kedua terjadi penggabungan string. Untuk data dalam jumlah besar, perbedaan waktu cukup mencolok. Catatan: ini hanya berfungsi dengan fungsi echo, yang dapat menggunakan banyak baris sebagai argumen.
  • $kembali="a"; $kembali.="b"; gema $kembali; lebih cepat dari echo "a"; gema "b";
    Alasannya adalah mengeluarkan data memerlukan beberapa operasi tambahan. Untuk data dalam jumlah besar, perbedaan waktu cukup mencolok.
  • ob_start(); gema "a"; gema "b"; ob_end_flush(); lebih cepat dari $return="a"; $kembali.="b"; gema $kembali;
    Ini karena semua pekerjaan dilakukan tanpa mengakses variabel. Untuk data dalam jumlah besar, perbedaan waktu cukup mencolok. Komentar: Teknik ini tidak efektif jika Anda bekerja dengan AJAX, karena dalam hal ini diinginkan untuk mengembalikan data sebagai string tunggal.
  • Gunakan "sisipan profesional" atau?> a b
    Data statis (kode luar) diproses lebih cepat daripada keluaran data PHP. Teknik ini disebut penyisipan profesional. Untuk data dalam jumlah besar, perbedaan waktu cukup mencolok.
  • readfile lebih cepat dari file_get_contents , file_get_contents lebih cepat dari require , dan require lebih cepat dari include untuk mengeluarkan konten statis dari satu file
    Waktu yang diperlukan untuk membaca file kosong bervariasi dari 0,001 untuk readfile hingga 0,002 untuk include .
  • require lebih cepat daripada include untuk file yang diinterpretasikan
    Komentar: ketika mencabang suatu algoritma, jika memungkinkan untuk tidak menggunakan file yang diinterpretasikan, Anda harus menggunakan include , karena require selalu menyertakan file.
  • if (...) (...) else if (...) () lebih cepat dari switch
    Waktunya tergantung jumlah cabang.
  • if (...) (...) else if (...) () lebih cepat daripada if (...) (...); jika (...) ();
    Waktunya tergantung jumlah cabang dan kondisi. Anda harus menggunakan else jika memungkinkan, karena ini adalah konstruksi "bersyarat" tercepat.
  • Kondisi paling umum dari konstruksi if (...) (...) else if (...) () harus ditempatkan di awal cabang
    Penerjemah memindai konstruksi dari atas ke bawah hingga menemukan kondisi terpenuhi. Jika penerjemah menemukan bahwa kondisinya terpenuhi, maka ia tidak akan melihat konstruksi lainnya.
  • < x; ++$i) {...} быстрее, чем for($i = 0; $i < sizeOf($array); ++$i) {...}
    Hal ini karena dalam kasus kedua operasi sizeOf akan dieksekusi pada setiap iterasi. Perbedaan waktu eksekusi bergantung pada jumlah elemen array.
  • x = ukuran($array); untuk($i = 0; $i< x; ++$i) {...} быстрее, чем foreach($arr as $value) {...} для не ассоциативных массивов
    Perbedaan waktu sangat signifikan dan meningkat seiring bertambahnya jumlah array.
  • preg_replace lebih cepat dari ereg_replace, str_replace lebih cepat dari preg_replace, tetapi strtr lebih cepat dari str_replace
    Perbedaan waktunya bergantung pada jumlah data dan dapat mencapai seperseribu detik.
  • Fungsi string lebih cepat daripada ekspresi reguler
    Aturan ini merupakan konsekuensi dari aturan sebelumnya.
  • Hapus variabel array yang tidak lagi diperlukan untuk mengosongkan memori.
  • Hindari menggunakan penekan kesalahan @
    Penekanan kesalahan menghasilkan sejumlah operasi yang sangat lambat, dan karena tingkat percobaan ulang bisa sangat tinggi, kehilangan kecepatan bisa menjadi signifikan.
  • if (isset($str(5))) (...) lebih cepat daripada if (strlen($str)>4)(...)
    Hal ini karena operasi uji isset standar digunakan sebagai pengganti fungsi strlen untuk memanipulasi string.
  • 0,5 lebih cepat dari 1/2
    Alasannya adalah pada kasus kedua dilakukan operasi pembagian.
  • return lebih cepat daripada global ketika mengembalikan nilai variabel dari suatu fungsi
    Hal ini karena dalam kasus kedua variabel global dibuat.
  • $row["id"] lebih cepat dari $row
    Opsi pertama 7 kali lebih cepat.
  • $_SERVER['REQUEST_TIME'] lebih cepat daripada time() untuk menentukan kapan skrip harus dijalankan
  • if ($var===null) (...) lebih cepat daripada if (is_null($var)) (...)
    Alasannya adalah dalam kasus pertama tidak ada penggunaan fungsi tersebut.
  • ++i lebih cepat dari i++ , --aku lebih cepat, daripada aku--
    Hal ini disebabkan oleh fitur inti PHP. Perbedaan waktunya kurang dari 0,000001, tetapi jika Anda mengulangi prosedur ini ribuan kali, lihat lebih dekat pengoptimalan ini.
  • Kenaikan variabel yang diinisialisasi i=0; ++saya; lebih cepat dari ++i yang tidak diinisialisasi
    Perbedaan waktunya sekitar 0,000001 detik, namun karena kemungkinan frekuensi pengulangan, fakta ini harus diingat.
  • Menggunakan variabel yang tidak digunakan lebih cepat daripada mendeklarasikan variabel baru
    Atau izinkan saya mengulanginya secara berbeda: Jangan membuat variabel yang tidak perlu.
  • Bekerja dengan variabel lokal kira-kira 2 kali lebih cepat dibandingkan dengan variabel global
    Meski perbedaan waktunya kurang dari 0,000001 detik, namun disebabkan frekuensi tinggi pengulangan, Anda harus mencoba bekerja dengan variabel lokal.
  • Mengakses variabel secara langsung lebih cepat daripada memanggil fungsi yang variabelnya didefinisikan beberapa kali
    Memanggil suatu fungsi membutuhkan waktu sekitar tiga kali lebih lama daripada memanggil variabel.

Pengoptimalan yang tidak berguna

Sejumlah metode optimasi tidak memberikan pengaruh apa pun dalam praktiknya pengaruh yang besar pada kecepatan eksekusi skrip (perolehan waktu kurang dari 0,000001 detik). Meskipun demikian, optimalisasi tersebut seringkali menjadi bahan kontroversi. Saya menyajikan fakta-fakta yang “tidak berguna” ini agar Anda tidak memberikan perhatian khusus padanya saat menulis kode di kemudian hari.
  • echo lebih cepat daripada mencetak
  • include("jalur absolut") lebih cepat dari pada include("jalur relatif")
  • sizeOf lebih cepat dari hitungan
  • foreach ($arr as $key => $value) (...) lebih cepat daripada reset ($arr); while (list($key, $value) = masing-masing ($arr)) (...) untuk array asosiatif
  • Kode yang tidak diberi komentar lebih cepat daripada kode yang diberi komentar karena kode tersebut keluar waktu tambahan untuk membaca file
    Sangat bodoh untuk mengurangi volume komentar demi optimasi; Anda hanya perlu melakukan minimalisasi dalam skrip yang berfungsi (“pertempuran”).
  • Variabel dengan nama pendek lebih cepat dibandingkan variabel dengan nama panjang
    Hal ini disebabkan oleh berkurangnya jumlah kode yang diproses. Mirip dengan poin sebelumnya, Anda hanya perlu melakukan minimalisasi dalam skrip kerja (“tempur”).
  • Menandai kode menggunakan tab lebih cepat dibandingkan menggunakan spasi
    Mirip dengan poin sebelumnya.
Terakhir, saya ingin mengingatkan Anda sekali lagi bahwa tips dan fakta yang saya berikan tidak mutlak dan pentingnya penerapannya bergantung pada situasi spesifik. Harus diingat bahwa optimasi skrip hanyalah sebagian kecil dari keseluruhan prosedur optimasi dan sering kali Anda dapat hidup dengan tenang tanpa tips di atas.

Bahan sebagian digunakan untuk menulis artikel ini.