PHP'de komut dosyası yürütme zamanı nasıl bulunur. PHP betiği yürütme süresi

Hangi sunucu sunucusunda olursa olsun, betiğiniz çalışıyor ancak hız sorunu herkesi ilgilendiriyor. Sunucudaki yük buna bağlıdır (bazı ücretsiz barındırmalarda, ayda belirli bir işlemci süresi verilir) ve kullanıcının siteyi görüntülemeye başladığı zaman (ve modern kullanıcılar sitenin yükleme süresi konusunda çok önemlidir).


  Bu çok hız, microtime () işleviyle çok basit bir şekilde belirlenebilir.
  Varsayılan olarak, işlev "msn sec" biçiminde bir dize döndürür, burada sn, Unix Epoch'un başından beri geçen saniye sayısıdır (Unix Epoch, 1 Ocak 1970, 00:00:00 GMT) ve msec, kesirli kısımdır.
  Fakat eğer fonksiyon isteğe bağlı microtime parametresiyle ([bool $ get_as_float]) çağrılırsa, argümanın geçmesi şartıyla   get_as_float   , TRUE veya 1, gerçek bir sayı döndürür, yani:

Echo microtime (); // 0,79687900 1234083984 eko elde edeceğiz echo microtime (0); // 0,79687900 1234083984 eko alıyoruz michoime time (false); // 0,79687900 1234083984 eko mikrotime (1) elde ediyoruz; // 1234083984.79 eko mikrotime (doğru); // 1234083984.79 alacağız
  Bundan sonra, php betiğinin en başında aşağıdaki satırı yazmış olursunuz:
  $ time_start_script = microtime (1);
  ve betiğin sonunda:
  $ time_stop_script = mikro zaman (1); $ time_script_work = $ time_stop_script - $ time_start_script; echo $ time_script_work;

komut dosyasının çalışma zamanını alıyoruz ki bu, yürütme hızını yeterince değerlendirmek için yeterli.

Eh, "bisikleti" hatırlarsanız, 10-15 ondalık basamağa kadar bir doğrulukla zaman kazanabilirsiniz (en azından tam olarak senaryo çalıştırma zamanına bağlı olarak yaptım), ancak bunun komut dosyası çalıştırma zamanı üzerinde daha büyük bir etkisi olacak, Yukarıdaki örneğin aksine, ancak başka bir kullanışlı özellik hakkında bilgi edineceksiniz.
  Php betiğinin en başında bir satır yazalım:
  $ time_start_script = microtime (); $ time_start_script = patlayabilir ("", $ time_start_script); $ time_start_script = $ time_start_script ["0"] + $ time_start_script ["1"];
  ve betiğin sonunda:
  $ time_stop_script = microtime (); $ time_stop_script = patlayabilir ("", $ time_stop_script); $ time_stop_script = $ time_stop_script ["0"] + $ time_stop_script ["1"]; $ time_script_work = $ time_stop_script - $ time_start_script; echo $ time_script_work. "sec";
Bu örnek benim durumumda 0.000353097915649 sn.
  Şimdi bu garip explode () fonksiyonunun ne olduğunu görelim.
  dizi patlaması (string $ separator, string $ string [, int $ limit])
  İşlev, ayırıcı olarak ayırıcı kullanarak dize dizesini bölerek elde edilen bir dizi dizisi döndürür. Eğer limit argümanı verilirse, dizi, kalan dizeyi içeren son eleman ile birlikte maksimum sınır elemanı içerecektir.
  Ayırıcı boş bir dize ("") ise, explode () FALSE değerini döndürür. Ayırıcı bir dizgede bulunmuyorsa, explode () bir dize öğesi içeren bir dizi döndürür.
  Kullanım örneği: $ pizza = "parça1 parça2 parça3 parça4 parça5 parça6"; $ adet = patlayabilir ("", $ pizza); yankı $ adet; // parça1 eko $ parça; // parça2
  Temel olarak hepsi bu. Artık yazdığınız komut dosyalarının hızını değerlendirebilirsiniz.
  Ekli dosya burada listelenen komut dosyalarının kaynak kodlarını içerirken, komut dosyasının daha uzun süre çalışması için milyonlarca kez yürütülen boş bir döngü içerir :).
  İyi şanslar!

10 Şubat 2012 13 Bölüm :,

Bazen kısa, eğitimli gözlerinizle sınırlı kalmamak kaydıyla bir komut dosyasının (veya komut dosyasının bir bölümünün) yürütme hızına ayrıntılı olarak dikkat etmeniz gerekir. PHP indirme hızını ölçmek için özellikleri kurtarmaya geldi. Muhtemelen onları kullandın ve genel olarak nasıl yapılacağını biliyorsun. Ancak tam olarak, nasıl yapıldığını bilmeyenler için olduğu gibi, "Önemli önemsemeler" bölümünde de, bu sorunu çözen en basit kodu yazıyorum.

$ start = microtime (doğru);
// komut dosyası gövdesi
echo "Script çalıştırma zamanı:". (microtime (true) - $ start). "sn.";

Her şey delilik. İlk satırda, başlangıç ​​zamanı olan bir değişken yaratıyoruz. Bu fonksiyon aracılığıyla elde edilir microtime   true ile geçti - bu, çok sayıda ondalık basamağa sahip saniye sayısını elde etmenizi sağlar. Bu arada, Unix formatında zaman.

Sonra tüm kod kodu gelir, bundan sonra, üçüncü satırda, şimdiki zamantan komut dosyasının başlangıcını ve ihaneti çıkarırız - php komut dosyasını ondalık basamağın doğruluğu ile yürütmek için zamanınız olur.


Tarayıcıyı kapatmak için çalışmalarının bitmesini beklemiyorsanız, "ağır" komut dosyaları ne kadar süreyle çalışmaya devam eder? Ve çalışmalarına devam edecekler mi? Gözlemlerin gösterdiği gibi, kendilerine verilen işi yapmaya çalışırken yaşamaya devam ederler. Bu tür zamanları kontrol etmek için çoğu, senaryoların "karanlık" yaşamı talimat yazmak için başvurur

ignore_user_abort (boole modu)

Bu talimat ile çağrılırsa yanlış   parametresi, onun yokluğuna eşdeğerdir. Genellikle parametre ile belirtilir. gerçek - ignore_user_abort (true). Tarayıcı bağlantıyı kesmiş olsa bile betiğe devam etmeniz gerektiğinde bu gereklidir. Genel olarak, php bağlantı durumunu takip etme yeteneğine sahiptir. Tarayıcı penceresini kapattıktan sonra bile senaryo devam ediyor durumla ilgileniyordum. Kontrol etmesi çok kolaydır: bir süre çalışan bir komut dosyası yazın, başlatın ve tarayıcı penceresini komut dosyası sona ermeden kapatın, komut dosyasına bir kapatma işareti eklemeyi unutmayın, örneğin bir dosya oluşturun. Böylece senaryonuzun performansını takip edebilirsiniz. Genel olarak, aracının oturumunu kapattıktan sonra (tarayıcı) komut dosyası ölmeli, ancak görebildiğiniz gibi bu tam olarak böyle değil: yine de daha uzun yaşamaya çalışıyor. Bu durumda, arkaplan uygulamasına (cron) aktarmak mantıklıdır. Ancak bu özelliği analiz etmek yine de ilginçti. Komut, bağlantı durumunu takip etmek için kullanılır. connection_status (). Daha ileri manipülasyonlar için ambalajlar yazılmıştır:

// connect durumunun dönüş kodu
getConnectStatus () (işlevi
  return connection_status ();
}

// koda göre bağlantı durumu türünü döndür
getConnectStatusByCode işlevi ($ connectionStatus) (
  anahtarı ($ connectionStatus) (
  CONNECTION_NORMAL örneği:
  $ status = "Normal";
  break;
  CONNECTION_ABORTED örneği:
  $ status = "Kullanıcı İptal";
  break;
  CONNECTION_TIMEOUT örneği:

  $ status = "Azami Yürütme Süresi Aşıldı";
  break;
  vaka (CONNECTION_ABORTED & CONNECTION_TIMEOUT):
  $ status = "İptal edildi ve Zaman Aşımına Uğradı";
  break;
  default:
  $ status = "Bilinmiyor";
  break;
}
  $ durumunu döndür;
}



}

Artık herhangi bir uzun çalışmayı simüle edecek bir fonksiyon yazabilirsiniz

// taklit uzun senaryo
function scriptImitation () (

  $ start = time ();

  $ limitIteration = 1.000.000;
  ($ i = 0; checkConnectionStatus () && ($ i için< $limitIteration); $i++) {
  // biraz uzun çalışma ...
}

  $ end = time ();
  $ runTime = $ end - $ başlangıç;

Eğer ($ i === $ limitIteration ||! CheckConnectionStatus ()) (
  $ connectStatus = getConnectStatusByCode (getConnectStatus ());
  $ scriptImitationLog = "Bağlantı durumu: $ connectStatus";
  $ scriptImitationLog. = ";";
  $ scriptImitationLog. = "İterasyon: $ i";
  $ scriptImitationLog. = ";";
  $ scriptImitationLog. = "Çalışma zamanı: $ runTime second";

File_put_contents ("scriptImitationLog.txt", $ scriptImitationLog);
}

Aslında periyodik olarak senaryomuzun çalışmasını durdurarak başlıyoruz. Aracı penceresini ne kadar çabuk kapatmaya çalışsam da, komut dosyası hala başarılı bir şekilde çalışıyordu ve çıktıda bir günlük oluşturuldu. Hakkında unutma max_execution_timeBu süreden daha uzun süre senaryo yayınlanmayacak. Bizim durumumuzda arttı. Kayıtlara bakalım:

Bağlanma durumu: Normal; İterasyon: 1.000.000; Çalışma zamanı: 5 saniye

Gördüğünüz gibi, bağlantı normal, döngü sona erdi. Peki anlaşma nedir? Bu makalede stackoverflow   Bu çözümü buldum - http://stackoverflow.com/questions/2389035/php-connection-status. Ve çıktı tamponu ile bağlandı: düzenli aralıklarla küçük bir veri bölümü (örneğin boş bir karakter) betiğin çıktı tamponuna yazılır ve ardından sıfırlanır (genellikle tüm içeriği gönderilmeye ve daha sonra silinmeye zorlamak için php anlamına gelir). Bu amaçla, fonksiyonların paylaşımının kullanılması önerilmiştir. ob_flush   ve floş. Sıfırlama işlemi için bir bağlantı ima edildiğinden (tampon tarayıcı - başlatıcı yönünde gönderilmek üzere oluşturulmuştur), ardından bir sonraki sıfırlamada normal bir bağlantı yoksa durumu farklı bir duruma aktarılır ( Kullanıcı iptal edildi). Ve komut dosyasında talimat yoksa veya formda verilirse

ignore_user_abort (yanlış);

Ardından, normal bağlantı durumu değiştiğinde, bir komut varsa, komut dosyası derhal çalışmayı durdurur

ignore_user_abort (true);

Bağlantı durumu değişse bile, komut dosyası sonuna kadar çalışmaya devam eder, ancak bu durumda bağlantı durumu izlenebilir. Bunu akılda tutarak, sarıcılardan birini biraz değiştiriyoruz.

// bağlantı durumunu kontrol et (doğru - normal, yanlış - anormal)
fonksiyon kontrolüConnectionStatus () (
  "" yazdır;
  ob_flush ();
  floş ();
  return connection_status () === 0;
}

Artık her şey kontrol altında ve tarayıcımızı kapattığımızda senaryo askıya alınacak veya başka davranışlar düzenlenebilir.
  Son olarak, başka bir gözlemin sonucunu vereceğim. Değişiklikleri yapmadan önce komut dosyasındaki çalışma zamanını günlüklerde ve daha sonra paketleyicide karşılaştırırsanız - checkConnectionStatus,
  çıkış tamponunun sıfırlanmasının uzun zaman aldığı sonucuna varılabilir. Bu nedenle test komut dosyasında arabellek sıfırlanmadan bir yineleme için ortalama süre aldı - 0,005 ms, sıfırlama ile - 0,028 msyani ortalama bir tampon yıkama 0,023 msiçinde 4,6 Birden fazla yinelemeden defalarca Bu, yukarıdaki "ağır" senaryoların çalışmalarının ömrünü takip etme yönteminin ana zamanı artırabileceğini göstermektedir. Bu test Firefox'un 29.0.1 sürümünde yapıldı. Tüm başarı.

Kodlarda hata ayıklama yaparken, ilk başta göz önünde bulundurulması gereken zorunlu bir faktör komut dosyası yürütme zamanı. Ve bu kısa makalede size çok iyi ve kolay bir yol göstereceğim. komut dosyası yürütme zamanı nasıl bulunur.

Tarih ve saatle çalışmak için fonksiyonlara dayanır. Nasıl olduğunu anlayabilmeniz için bir örnek düşünmeyi öneriyorum. komut dosyası yürütme süresi:

   $ start = microtime (doğru);
   $ sum = 0;
   ($ i = 0; $ i< 100000; $i++) $sum += $i;
   echo "Script çalıştırma zamanı:". (microtime (true) - $ start);
?>

Sonuç olarak, göreceğiz ki komut dosyası yürütme zamanı   örneğin, olacak: " 0.014652967453 ". Eğer toparlarsanız, o zaman bu 0.015   saniye. Bu betiğin yürütme zamanıdır.

Şimdi nasıl çalışıyor. fonksiyon mikro zaman ()   iletilen değer ile gerçek   gece yarısından beri geçen saniye sayısını döndürür 01.01.1970 ve bu değer bir saniyenin yüzdeleri için hesaplanır.

Daha sonra kontrol ettiğimiz normal senaryo geliyor. Bunun yerine, kesinlikle senaryonuz olacak. Ve son olarak, son satır, geçerli zamanla (komut dosyası çalıştırıldıktan sonra) ve komut dosyasının başında kaydettiğimiz şey arasındaki farktır. Komut dosyasının yürütülmesinden sonraki zamandaki fark ve başlamadan önceki zaman ve komut dosyası yürütme zamanı.

Bence burada her şey basit. Fakat zaman hesaplama yöntemini kullanmanızı şiddetle tavsiye ediyorum. Örneğin, bu sitenin üzerinde durduğu motorumun çalışmalarında hata ayıkladığımda, çalışmalarını neredeyse 2   defa.

PHP'yi ne kadar kullanıyor olursak olalım, hala duymadığımız bazı fonksiyonlar açılır. Bazıları bizim için çok faydalı olurdu. Her PHP programcısının cephaneliğinde olması gereken küçük bir yararlı fonksiyonlar listesi oluşturdum.

1. Değişken değişkenli argümanlarla fonksiyon oluşturma

Büyük olasılıkla, PHP'nin isteğe bağlı argümanlarla işlevler oluşturmamıza izin verdiğini zaten biliyorsunuz. Şimdi, argüman sayısının durumdan duruma değişebileceği bir işlev göstereceğim.

Ama önce, işlevleri nasıl yaptığımızı her zamanki gibi hatırlayalım:

  // iki isteğe bağlı parametre ile işlev foo ($ arg1 = "", $ arg2 = "") (echo "arg1: $ arg1 \\ n"; echo "arg2: $ arg2 \\ n";) foo ("merhaba", "Dünya"); / * çıkacaktır: arg1: hello arg2: world * / foo (); / * çıkacaktır: arg1: arg2: * /

Şimdi sınırsız sayıda argüman içeren bir fonksiyonu nasıl yazabileceğinizi görelim. Bunu yapmak için, func_get_args () yöntemini kullanın:

  // argüman işlevini belirtmeyin foo () (// $ args = func_get_args (); foreach ($ k =\u003e $ v gibi $ args) (echo "arg". ($ k + 1). " : $ v \\ n ";)) foo (); / * hiçbir şey çıkarmaz * / foo ("merhaba"); / * arg1 basar: merhaba * / foo ("merhaba", "dünya", "tekrar"); / * arg1: merhaba arg2 yazdıracak: world arg3: again * /

2. Dosyaları aramak için Glob () kullanın.

Genellikle fonksiyon isimleri kendileri için konuşur. Bu glob () işlevi hakkında söylenemez.

Ayrıntılara girmeden, işlevi scandir () yöntemine benzer. Bulmanı sağlar gerekli dosya   desene göre:

  // tüm php dosyalarını bul $ files = glob ("*. php"); print_r ($ dosyalar); / * çıkacaktır: Array (=\u003e phptest.php =\u003e pi.php =\u003e post_output.php =\u003e test.php) * /

Çeşitli türdeki dosyaları bulmak için şunu yazın:

  // tüm php ve txt dosyalarını bul $ files = glob ("*. (php, txt)", GLOB_BRACE); print_r ($ dosyalar); / * output: Array (=\u003e phptest.php =\u003e pi.php =\u003e post_output.php =\u003e test.php =\u003e log.txt =\u003e test.txt) * /

Şablondaki yolu da belirtebilirsiniz:

  $ files = glob ("../ images / a * .jpg"); print_r ($ dosyalar); / * output: Array (=\u003e ../images/apple.jpg =\u003e ../images/art.jpg) * /

Belgenin tam yolunu bulmak için realpath () yöntemini kullanın:

  $ files = glob ("../ images / a * .jpg"); // "realpath" işlevini $ files dizisinin her bir öğesine uygulayın = array_map ("realpath", $ files); print_r ($ dosyalar); / * görüntüler: Array (=\u003e C: \\ wamp \\ www \\ images \\ apple.jpg =\u003e C: \\ wamp \\ www \\ images \\ art.jpg) * /

3. Kullanılan hafıza hakkında bilgi

Komut dosyalarınızın çalışmasıyla tüketilen hafıza miktarını takip ederseniz, bunları daha sık optimize edersiniz.

PHP'de güçlü bir bellek izleme aracı var. Komut dosyasının farklı bölümlerinde yük farklı olabilir. Şu anda kullanılan belleğin değerini almak için, memory_get_usage () yöntemini kullanmamız gerekir. Maksimum kullanılan bellek miktarını sabitlemek için memory_get_peak_usage ()

Echo "İlk:" .memory_get_usage (). "Bytes \\ n"; / * İlk: 361400 bytes * / // küçük bir yük verir ($ i = 0; $ i< 100000; $i++) { $array = md5($i); } // и ещё for ($i = 0; $i < 100000; $i++) { unset($array[$i]); } echo "Final: ".memory_get_usage()." bytes \n"; /* Final: 885912 bytes */ echo "Peak: ".memory_get_peak_usage()." bytes \n"; /* Peak: 13687072 bytes */

4. İşlemci Bilgisi

Bunu yapmak için getrusage () yöntemini kullanın. Ancak bu fonksiyonun Windows'ta çalışmayacağını unutmayın.

Print_r (getrusage ()); / * Dizi yazdırır (=\u003e 0 =\u003e 0 =\u003e 2 =\u003e 3 =\u003e 12692 =\u003e 764 =\u003e 3864 =\u003e 94 =\u003e 0 =\u003e 1 =\u003e 67 =\u003e 4 =\u003e 0 =\u003e 0 =\u003e 0 =\u003e 6269 =\u003e 0) * /

Yukarıda ana hatlarıyla gösterilen resim sistem yönetiminde tecrübesi olanlar için net olacaktır. Diğerleri için kod çözmeyi öneriyoruz:

  • ru_oublock: blok yazma işlemlerinin sayısı
  • ru_inblock: blok okuma işlemlerinin sayısı
  • ru_msgsnd: gönderilen mesajların sayısı
  • ru_msgrcv: Alınan mesajların sayısı
  • ru_maxrss: disk belleği olmayan bir kümenin maksimum boyutu
  • ru_ixrss: toplam paylaşılan hafıza
  • ru_idrss: toplam paylaşılmayan veri miktarı
  • ru_minflt: Kullanılan hafıza sayfalarının sayısı
  • ru_majflt: sayfa eksik hata sayısı
  • ru_nsignals: Alınan sinyallerin sayısı
  • ru_nvcsw: işleme göre bağlam anahtarı sayısı
  • ru_nivcsw: zorunlu içerik anahtarlarının sayısı
  • ru_nswap: çağrı yaparken erişilen disk sayısı
  • ru_utime.tv_usec: kullanıcı modu zamanı (mikrosaniye)
  • ru_utime.tv_sec: kullanıcı modu (saniye)
  • ru_stime.tv_usec: ayrıcalıklı modda süre (mikrosaniye)
  • ru_stime.tv_sec: ayrıcalıklı modda süre (saniye)

İşlemcinizin komut dosyasını hangi kaynakları kullandığını bulmak için, "kullanıcı saati" (kullanıcı modunda saat) ve "sistem saati" (ayrıcalıklı modda saat) değerine ihtiyacınız vardır. Sonucu hem saniye hem de mikrosaniye cinsinden elde edebilirsiniz. Toplam saniye sayısını ondalık sayıya çevirmek için, mikrosaniye değerini 1 milyona bölmeniz ve ikinci değere eklemeniz gerekir.

Bir şekilde karıştı. İşte bir örnek:

  // 3 saniye dinlen uyku (3); $ data = getrusage (); yankı "Kullanıcı zamanı:". ($ veri ["en_utime.tv_sec"] + $ veri ["en_utime.tv_usec"] / 1,000,000); yankı "Sistem zamanı:". ($ veri ["ru_stime.tv_sec"] + $ veri ["ru_stime.tv_usec"] / 1,000,000); / * ekranları Kullanıcı zamanı: 0.011552 Sistem zamanı: 0 * /

Komutun tamamlanması yaklaşık 3 saniye sürse de, işlemci çok yüklenmedi. Gerçek şu ki çağırırken (uykuda), komut dosyası neredeyse hiç CPU kaynağı tüketmiyor. Genel olarak, oldukça zaman alan, ancak işlemci kullanmayan birçok işlem vardır. Örneğin, diskle ilişkili işlemleri bekliyor. Böylece her zaman betiklerinde CPU zamanını kullanmazsınız.

İşte başka bir örnek:

  // 10 milyon kere yürüyün ($ i = 0; $ i<10000000;$i++) { } $data = getrusage(); echo "User time: ". ($data["ru_utime.tv_sec"] + $data["ru_utime.tv_usec"] / 1000000); echo "System time: ". ($data["ru_stime.tv_sec"] + $data["ru_stime.tv_usec"] / 1000000); /* выводит User time: 1.424592 System time: 0.004204 */

Betik 1.4 saniye CPU süresine sahipti. Bu durumda, sistem çağrısı genellikle düşüktür.

Ayrıcalıklı modda çalışma süresi (Sistem Saati), işlemcinin program adına çekirdeğe sistem isteklerini yürütmek için harcadığı zamandır. örnek:

  $ start = microtime (doğru); // her 3 saniyede bir microtime çağrısı yaparken (microtime (true) - $ start< 3) { } $data = getrusage(); echo "User time: ". ($data["ru_utime.tv_sec"] + $data["ru_utime.tv_usec"] / 1000000); echo "System time: ". ($data["ru_stime.tv_sec"] + $data["ru_stime.tv_usec"] / 1000000); /* выводит User time: 1.088171 System time: 1.675315 */

Şimdi, sistem zamanı önceki örnekte olduğundan çok daha fazla zaman harcadı. Tüm sistem kaynaklarını kullanan microtime () yöntemi sayesinde.

Ancak, gösterilen zamanın doğru olamayacağına dikkat edilmelidir, çünkü Bu noktada, CPU kaynakları diğer programlar tarafından kullanılır ve bu da küçük bir hataya neden olabilir.

5. Sihirli sabitler

PHP'de mevcut satır numarası (__LINE__), dosya yolu (__FILE__), dizin yolu (__DIR__), işlev adı (__FUNCTION__), sınıf adı (__CLASS__), işlev adı (__FUNCTION__), sınıf adı (__CLASS__), yöntem adı (__METHOD__) ve ad alanı gibi birçok sihirli sabit vardır. (__NAMESPACE__).

Hepimiz onları dikkate almayacağız. Sadece bir çift görelim:

  // bu komut dosyası dosyanın geçerli konumuna bağlıdır ve // ​​farklı dizinlerden kullanılıyorsa sorunlara yol açabilir. needs_once ("config / database.php"); // bu betik problemlere neden olmayacak. request_once (dirname (__ FILE__). "/config/database.php");

Komut dosyalarında hata ayıklama yaparken __LINE__ kullanın:

  // code // ... my_debug ("bazı hata ayıklama mesajları", __LINE__); / * Satır 4'ü verecek: bazı hata ayıklama mesajları * / // başka bir kod // ... my_debug ("başka bir hata ayıklama mesajı", __LINE__); / * Satır 11 çıkacak: başka bir hata ayıklama mesajı * / function my_debug ($ msg, $ line) (echo "Satır $ satır: $ msg \\ n";)

6. Benzersiz kimlikler oluşturma

Benzersiz bir dize oluşturmanız gereken zamanlar vardır. Çoğu zaman md5 () işlevinin bu sorunu çözmek için kullanıldığını gördüm:

  // rastgele bir dize üretir echo md5 (time (). mt_rand (1.1000000));

Fakat aslında, PHP'de bu amaç için uniqid () özel bir fonksiyon var.

  // rastgele bir dize oluşturur echo uniqid (); / * 4bd67c947233e * / // bir kez daha yazdıracak yankı uniqid (); / * 4bd67c9472340 * çıktısını alacak * /

Çıplak gözle, ilk karakterlerin hafifçe benzer hale getirilmesi gerektiğini görebilirsiniz ... Bu, bu yöntemin karakter üretmek için sunucu zamanını kullanmasından kaynaklanmaktadır. Hatta yararlıdır, çünkü Üretilen tüm değerler alfabetik sıraya göre elde edilir, bu da onları hızlı bir şekilde sıralamayı mümkün kılar.

Kopya alma şansını azaltmak için önek ekleyebilir veya ikinci parametreyi kullanabiliriz (karakter sayısını artırın):

  // önek eko ile birlikte uniqid ("foo_"); / *, foo_4bd67d6cd8b8f * / // çıkışını ikinci parametre echo uniqid ("", true); / * 4bd67d6cd8b926.12135106 * / // çıktısını eko uniqid ("bar _", true); / * yazdırır bar_4bd67da367b650.43684647 * /

Bu yöntem md5'ten daha küçük çizgiler oluşturur, böylece yerden tasarruf sağlar.

7. Serileştirme

Karmaşık verileri bir veritabanında veya bir dosyada saklamak zorunda kaldınız mı? Bir nesneyi PHP'de bir dizgeye dönüştürmek için özel bir işlev sağlanmıştır.

Genel olarak konuşursak, bu yöntemler 2'dir: serialize () ve unerialize ()

  // karmaşık dizi $ myvar = dizi ("merhaba", 42, dizi (1, "iki"), "elma"); // dizeye dönüştürmek $ string = serialize ($ myvar); echo $ string; / * a: 4: (i: 0; s: 5: "merhaba"; i: 1; i: 42; i: 2; a: 2: (i: 0; i: 1; i: 1; s : 3: "iki";) i: 3; s: 5: "elmayı";) * / // başlangıç ​​değerini elde ederiz $ newvar = unserialize ($ string); print_r ($ newvar); / * Array (=\u003e hello =\u003e 42 =\u003e Array (=\u003e 1 =\u003e iki) =\u003e elma) * /

Bu fonksiyonlar böyle çalışır. Bununla birlikte, JSON popülaritesindeki hızlı büyüme nedeniyle PHP 5.2'ye 2 PHP metodu json_encode () ve json_decode () eklenmiştir. Çalışmaları serialize () işlevine benzer:

  // karmaşık dizi $ myvar = dizi ("merhaba", 42, dizi (1, "iki"), "elma"); // dizeye dönüştürmek $ string = json_encode ($ myvar); echo $ string; / * ["merhaba", 42 ,, "elma"] çıktısını alacak * / // orjinal değerini geri yükleyecektir $ newvar = json_decode ($ string); print_r ($ newvar); / * Array (=\u003e hello =\u003e 42 =\u003e Array (=\u003e 1 =\u003e iki) =\u003e elma) * /

Bu seçenek daha kompakt ve JavaScript gibi diğer dillerle uyumludur. Ancak, çok yığılmış nesnelerle çalışırken, veri kaybı oluşabilir.

8. Satırları sıkıştır

Sıkıştırma hakkında konuştuğumuzda, ZIP arşiv dosyaları hemen akla geliyor. PHP, uzun satırları herhangi bir dosya olmadan sıkıştırma olanağı sağlar.

Aşağıdaki örnekte, gzcompress () ve gzuncompress () işlevlerinin çalışmasını gösteriyoruz:

$ string = "Lorem ipsum dolor amet sitet, adipiscing elit elit. Nunc ut elit no ulticies adipiscing. Nulla facilisi. , alem pretium ullamcorper urna quis iaculis, el yapımı ac massa sed turpis tempor luctus, curabitur nibh ab elit mollis congue. mollis içinde süslü, mollis içinde süslü, mollis içinde süslü, mienis inn, güveler inn, mienis inn, miriusis inn eutomi, ud malesuada lacus ein nulla neute eget metus hendreritescelerisque ab non enim. . "; $ sıkıştırılmış = gzcompress ($ string); yankı "Orijinal boyut:". strlen ($ string). "\\ n"; / * görüntülenecektir Orijinal boyut: 800 * / echo "Sıkıştırılmış boyut:". strlen ($ sıkıştırılmış). "\\ n"; / * print Sıkıştırılmış boyut: 418 * / // return $ original = gzuncompress ($ sıkıştırılmış);

Metin miktarını% 50 azaltabiliriz. Aynı amaçla, farklı bir sıkıştırma algoritması kullanan gzencode () ve gzdecode () yöntemlerini kullanabilirsiniz.

9. Tamamlanmadan önce koş

PHP'de, komut dosyasından çıkmadan önce bazı kodları çalıştırmanıza izin verecek bir register_shutdown_function () işlevi vardır.

Bazı bilgileri öğrenmek istediğinizi varsayalım ... Komut dosyası çalışma zamanı:

  // başlangıç ​​saatini alın $ start_time = microtime (true); // bazı işlemler // ... // çalışma zamanını gösterir echo "execution took:". (microtime (true) - $ başlangıç_zamanı). "Saniye".;

İlk bakışta, bu önemsiz bir görev gibi görünebilir. Bu amaçla, kodu dosyanın sonuna koyabilirsiniz. Bununla birlikte, eğer bundan önce exit () işlevi bir yerde çalışıyorsa, bu kod asla çalışmayacaktır. Ayrıca, sayfada bir hata olması veya kullanıcının sayfa yüklemeyi kesmesi durumunda (tarayıcınızdaki ilgili düğmeye tıklayarak) çalışmaz;

Register_shutdown_function () yöntemini kullanırken, kod yine de çalıştırılacak:

  $ start_time = mikrotime (true); register_shutdown_function ("my_shutdown"); işlevi my_shutdown () (global $ start_time; echo "çalıştırma:". (microtime (true) - $ start_time). "saniye.";)

Sonuç

PHP, içeriği ile bizi şaşırtmaktan asla vazgeçmeyen bir gezegendir. Bu özellikler hakkında ne düşünüyorsunuz?

Tema devam ediyor:
cihazlar

Belki de gelecekteki bir tablet kullanıcısının satın alırken karşılayabileceği en utanç verici tuzak sahtedir. Kopyalama için en popüler modellerden biri ...