Cara menggunakan getrusage php

Returns an associative array containing the data returned from the system call. All entries are accessible by using their documented field names.

Example #1 getrusage() example

复制

This function is now supported on Windows.

Note: On Windows getrusage() will only return the following members:

  • "ru_majflt" (only if who is RUSAGE_SELF)

  • "ru_maxrss" (only if who is RUSAGE_SELF)

If getrusage() is called with who set to 1 (RUSAGE_CHILDREN), then resource usage for threads are collected (meaning that internally the function is called with

1).

Dua kali sebulan, kami meninjau kembali beberapa posting favorit pembaca kami dari sepanjang sejarah Nettuts+.

Bahkan setelah menggunakan PHP selama bertahun-tahun, kami menemukan fungsi dan fitur yang tidak kami ketahui. Beberapa darinya bisa sangat berguna, namun kurang dimanfaatkan. Dengan pemikiran tersebut, saya telah mengumpulkan daftar sembilan fungsi dan fitur PHP yang sangat berguna yang Anda harus mengetahuinya.


1. Fungsi dengan Jumlah Argumen yang Bebas

Anda mungkin sudah mengetahui bahwa PHP memungkinkan Anda mendefinisikan fungsi dengan argumen opsional. Tapi ada juga metode untuk mengizinkan jumlah argumen fungsi yang benar-benar bebas.

Pertama, berikut adalah contoh dengan argumen opsional saja:

// function with 2 optional arguments
function foo($arg1 = '', $arg2 = '') {

  echo "arg1: $arg1\n";
	echo "arg2: $arg2\n";

}


foo('hello','world');
/* prints:
arg1: hello
arg2: world
*/

foo();
/* prints:
arg1:
arg2:
*/

Sekarang, mari kita lihat bagaimana kita bisa membangun sebuah fungsi yang menerima berbagai jumlah argumen. Kali ini kita akan memanfaatkan func_get_args():

// yes, the argument list can be empty
function foo() {

	// returns an array of all passed arguments
	$args = func_get_args();

	foreach ($args as $k => $v) {
		echo "arg".($k+1).": $v\n";
	}

}

foo();
/* prints nothing */

foo('hello');
/* prints
arg1: hello
*/

foo('hello', 'world', 'again');
/* prints
arg1: hello
arg2: world
arg3: again
*/

2. Menggunakan Glob() untuk Menemukan File

Banyak fungsi PHP yang memiliki nama panjang dan deskriptif. Namun mungkin akan sulit untuk menjelaskan apa yang dilakukan fungsi bernama glob() kecuali Anda sudah akrab dengan kata tersebut dari tempat lain.

Anggap sebagai versi yang lebih mumpuni dari fungsi scandir(). Ia membiarkan Anda mencari file dengan menggunakan pola.

// get all php files
$files = glob('*.php');

print_r($files);
/* output looks like:
Array
(
    [0] => phptest.php
    [1] => pi.php
    [2] => post_output.php
    [3] => test.php
)
*/

Anda bisa mengambil beberapa tipe file seperti ini:

// get all php files AND txt files
$files = glob('*.{php,txt}', GLOB_BRACE);

print_r($files);
/* output looks like:
Array
(
    [0] => phptest.php
    [1] => pi.php
    [2] => post_output.php
    [3] => test.php
    [4] => log.txt
    [5] => test.txt
)
*/

Perhatikan bahwa sebenarnya file bisa dikembalikan dengan path, tergantung pada query Anda:

$files = glob('../images/a*.jpg');

print_r($files);
/* output looks like:
Array
(
    [0] => ../images/apple.jpg
    [1] => ../images/art.jpg
)
*/

Jika Anda menginginkan path lengkap dari masing-masing file, Anda cukup menggunakan fungsi realpath() pada nilai-nilai yang dikembalikan:

$files = glob('../images/a*.jpg');

// applies the function to each array element
$files = array_map('realpath',$files);

print_r($files);
/* output looks like:
Array
(
    [0] => C:\wamp\www\images\apple.jpg
    [1] => C:\wamp\www\images\art.jpg
)
*/

3. Informasi Penggunaan Memori

Dengan mengamati penggunaan memori dari skrip, Anda dapat mengoptimalkan kode Anda lebih baik lagi.

PHP memiliki garbage collector dan memory manager yang cukup kompleks. Jumlah memori yang digunakan oleh skrip Anda. bisa naik dan turun selama eksekusi skrip. Untuk mendapatkan penggunaan memori saat ini, kita dapat menggunakan fungsi memory_get_usage(), dan untuk mendapatkan jumlah tertinggi dari memori yang digunakan pada setiap titik, kita dapat menggunakan fungsi memory_get_peak_usage().

echo "Initial: ".memory_get_usage()." bytes \n";
/* prints
Initial: 361400 bytes
*/

// let's use up some memory
for ($i = 0; $i < 100000; $i++) {
	$array []= md5($i);
}

// let's remove half of the array
for ($i = 0; $i < 100000; $i++) {
	unset($array[$i]);
}

echo "Final: ".memory_get_usage()." bytes \n";
/* prints
Final: 885912 bytes
*/

echo "Peak: ".memory_get_peak_usage()." bytes \n";
/* prints
Peak: 13687072 bytes
*/

4. Informasi Penggunaan CPU

Untuk ini, kita akan memanfaatkan fungsi getrusage(). Perlu diingat bahwa ini tidak tersedia pada platform Windows.

print_r(getrusage());
/* prints
Array
(
    [ru_oublock] => 0
    [ru_inblock] => 0
    [ru_msgsnd] => 2
    [ru_msgrcv] => 3
    [ru_maxrss] => 12692
    [ru_ixrss] => 764
    [ru_idrss] => 3864
    [ru_minflt] => 94
    [ru_majflt] => 0
    [ru_nsignals] => 1
    [ru_nvcsw] => 67
    [ru_nivcsw] => 4
    [ru_nswap] => 0
    [ru_utime.tv_usec] => 0
    [ru_utime.tv_sec] => 0
    [ru_stime.tv_usec] => 6269
    [ru_stime.tv_sec] => 0
)

*/

Mungkin itu terlihat sedikit samar kecuali Anda sudah memiliki latar belakang system administration. Berikut adalah penjelasan dari masing-masing nilai (Anda tidak perlu menghafalnya)

  • ru_oublock: blokir operasi output
  • ru_inblock: blok operasi input
  • ru_msgsnd: pesan yang dikirim
  • ru_msgrcv: pesan yang diterima
  • ru_maxrss: menetapkan ukuran yang tetap tinggal maksimum
  • ru_ixrss: ukuran berbagi memori integral
  • ru_idrss: ukuran data yang tidak dibagi integral
  • ru_minflt: pembaruan halaman
  • ru_majflt: kesalahan halaman
  • ru_nsignals: sinyal yang diterima
  • ru_nvcsw: konteks switch sukarela
  • ru_nivcsw: konteks switch disengaja
  • ru_nswap: swap
  • ru_utime.tv_usec: waktu yang digunakan pengguna (mikrodetik)
  • ru_utime.tv_sec: waktu yang digunakan pengguna (detik)
  • ru_stime.tv_usec: waktu yang digunakan sistem (mikrodetik)
  • ru_stime.tv_usec: waktu yang digunakan sistem (detik)

Untuk melihat berapa banyak daya CPU yang telah dikonsumsi skrip ini, kita perlu melihat nilai-nilai 'user time' dan 'system time'. Porsi detik dan mikrodetik disediakan terpisah secara default. Anda dapat membagi nilai mikrodetik sebesar 1 juta, dan menambahkannya ke nilai detik, untuk mendapatkan total detik sebagai angka desimal.

Mari kita lihat contohnya:

// sleep for 3 seconds (non-busy)
sleep(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);

/* prints
User time: 0.011552
System time: 0
*/

Meskipun skrip butuh waktu sekitar 3 detik untuk berjalan, penggunaan CPU adalah sangat sangat rendah. Karena selama operasi sleep, skrip benar-benar tidak mengkonsumsi sumber daya CPU. Ada banyak tugas-tugas lainnya yang mungkin memakan waktu yang nyata, tapi mungkin tidak menggunakan waktu CPU, seperti menunggu operasi disk. Jadi seperti yang Anda lihat, penggunaan CPU dan panjang sebenarnya dari runtime tidak selalu sama.

Berikut adalah contoh yang lain:

// loop 10 million times (busy)
for($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);

/* prints
User time: 1.424592
System time: 0.004204
*/

Bahwa butuh waktu sekitar 1,4 detik dari waktu CPU, hampir semua adalah waktu pengguna, karena tidak ada panggilan sistem.

Syatem Time adalah jumlah waktu CPU yang dihabiskan melakukan panggilan sistem untuk kernel atas nama program. Berikut adalah contoh darinya:

// yes, the argument list can be empty
function foo() {

	// returns an array of all passed arguments
	$args = func_get_args();

	foreach ($args as $k => $v) {
		echo "arg".($k+1).": $v\n";
	}

}

foo();
/* prints nothing */

foo('hello');
/* prints
arg1: hello
*/

foo('hello', 'world', 'again');
/* prints
arg1: hello
arg2: world
arg3: again
*/
0

Sekarang kita memiliki sedikit penggunaan waktu sistem. Ini karena skrip memanggil fungsi microtime() berkali-kali, yang melakukan permintaan melalui sistem operasi untuk mengambil waktu.

Anda juga mungkin melihat angka-angka itu tidak cukup menambahkan hingga 3 detik. Ini karena mungkin ada proses lain pada server juga, dan skrip tidak menggunakan CPU 100% untuk seluruh durasi 3 detik.


5. Konstanta Magic

PHP menyediakan konstanta magic berguna untuk mengambil nomor baris saat ini (

// get all php files
$files = glob('*.php');

print_r($files);
/* output looks like:
Array
(
    [0] => phptest.php
    [1] => pi.php
    [2] => post_output.php
    [3] => test.php
)
*/
1), path file (
// get all php files
$files = glob('*.php');

print_r($files);
/* output looks like:
Array
(
    [0] => phptest.php
    [1] => pi.php
    [2] => post_output.php
    [3] => test.php
)
*/
2), path direktori (
// get all php files
$files = glob('*.php');

print_r($files);
/* output looks like:
Array
(
    [0] => phptest.php
    [1] => pi.php
    [2] => post_output.php
    [3] => test.php
)
*/
3), nama fungsi (
// get all php files
$files = glob('*.php');

print_r($files);
/* output looks like:
Array
(
    [0] => phptest.php
    [1] => pi.php
    [2] => post_output.php
    [3] => test.php
)
*/
4), nama kelas (
// get all php files
$files = glob('*.php');

print_r($files);
/* output looks like:
Array
(
    [0] => phptest.php
    [1] => pi.php
    [2] => post_output.php
    [3] => test.php
)
*/
5), nama metode (__METHOD__) dan namespace (
// get all php files
$files = glob('*.php');

print_r($files);
/* output looks like:
Array
(
    [0] => phptest.php
    [1] => pi.php
    [2] => post_output.php
    [3] => test.php
)
*/
6).

Kita tidak akan membahas setiap salah satu darinya di artikel ini, tapi saya akan menunjukkan kepada Anda beberapa kasus penggunaan.

Ketika memasukkan skrip lain, adalah ide yang baik untuk memanfaatkan konstanta 

// get all php files
$files = glob('*.php');

print_r($files);
/* output looks like:
Array
(
    [0] => phptest.php
    [1] => pi.php
    [2] => post_output.php
    [3] => test.php
)
*/
2 (atau juga 
// get all php files
$files = glob('*.php');

print_r($files);
/* output looks like:
Array
(
    [0] => phptest.php
    [1] => pi.php
    [2] => post_output.php
    [3] => test.php
)
*/
8, pada PHP 5.3):

// yes, the argument list can be empty
function foo() {

	// returns an array of all passed arguments
	$args = func_get_args();

	foreach ($args as $k => $v) {
		echo "arg".($k+1).": $v\n";
	}

}

foo();
/* prints nothing */

foo('hello');
/* prints
arg1: hello
*/

foo('hello', 'world', 'again');
/* prints
arg1: hello
arg2: world
arg3: again
*/
1

Menggunakan 

// get all php files
$files = glob('*.php');

print_r($files);
/* output looks like:
Array
(
    [0] => phptest.php
    [1] => pi.php
    [2] => post_output.php
    [3] => test.php
)
*/
1 membuat debugging lebih mudah. Anda dapat melacak nomor baris:

// yes, the argument list can be empty
function foo() {

	// returns an array of all passed arguments
	$args = func_get_args();

	foreach ($args as $k => $v) {
		echo "arg".($k+1).": $v\n";
	}

}

foo();
/* prints nothing */

foo('hello');
/* prints
arg1: hello
*/

foo('hello', 'world', 'again');
/* prints
arg1: hello
arg2: world
arg3: again
*/
2

6. Menghasilkan ID yang Unik

Mungkin ada situasi di mana Anda perlu menghasilkan sebuah string unik. Saya telah melihat banyak orang gunakan fungsi 

// get all php files AND txt files
$files = glob('*.{php,txt}', GLOB_BRACE);

print_r($files);
/* output looks like:
Array
(
    [0] => phptest.php
    [1] => pi.php
    [2] => post_output.php
    [3] => test.php
    [4] => log.txt
    [5] => test.txt
)
*/
0 untuk hal ini, meskipun itu tidak benar-benar dimaksudkan untuk tujuan ini:

// yes, the argument list can be empty
function foo() {

	// returns an array of all passed arguments
	$args = func_get_args();

	foreach ($args as $k => $v) {
		echo "arg".($k+1).": $v\n";
	}

}

foo();
/* prints nothing */

foo('hello');
/* prints
arg1: hello
*/

foo('hello', 'world', 'again');
/* prints
arg1: hello
arg2: world
arg3: again
*/
3

Sebenarnya ada fungsi PHP yang bernama uniqid() yang dimaksudkan untuk digunakan pada hal ini.

// yes, the argument list can be empty
function foo() {

	// returns an array of all passed arguments
	$args = func_get_args();

	foreach ($args as $k => $v) {
		echo "arg".($k+1).": $v\n";
	}

}

foo();
/* prints nothing */

foo('hello');
/* prints
arg1: hello
*/

foo('hello', 'world', 'again');
/* prints
arg1: hello
arg2: world
arg3: again
*/
4

Anda mungkin memperhatikan bahwa meskipun string-nya unik, mereka tampak serupa untuk beberapa karakter pertama. Ini karena string yang dihasilkan adalah terkait dengan waktu server. Ini benar-benar memiliki efek samping yang bagus, karena setiap id yang baru yang dihasilkan datang kemudian dalam urutan abjad, sehingga mereka dapat diurutkan.

Untuk mengurangi kemungkinan mendapatkan duplikat, Anda dapat menyampaikan awalan, atau parameter kedua untuk meningkatkan entropi:

// yes, the argument list can be empty
function foo() {

	// returns an array of all passed arguments
	$args = func_get_args();

	foreach ($args as $k => $v) {
		echo "arg".($k+1).": $v\n";
	}

}

foo();
/* prints nothing */

foo('hello');
/* prints
arg1: hello
*/

foo('hello', 'world', 'again');
/* prints
arg1: hello
arg2: world
arg3: again
*/
5

Fungsi ini akan menghasilkan string yang lebih pendek daripada 

// get all php files AND txt files
$files = glob('*.{php,txt}', GLOB_BRACE);

print_r($files);
/* output looks like:
Array
(
    [0] => phptest.php
    [1] => pi.php
    [2] => post_output.php
    [3] => test.php
    [4] => log.txt
    [5] => test.txt
)
*/
0, yang juga akan menghemat beberapa ruang.


7. Serialisasi

Pernahkah Anda perlu menyimpan variabel kompleks dalam database atau file teks? Anda tidak harus datang dengan solusi mewah untuk mengkonversi array atau objek ke dalam string yang ter-format, karena PHP sudah memiliki fungsi untuk tujuan ini.

Ada dua metode populer dari serialisasi variabel. Berikut adalah contoh yang menggunakan serialize() dan unserialize():

// yes, the argument list can be empty
function foo() {

	// returns an array of all passed arguments
	$args = func_get_args();

	foreach ($args as $k => $v) {
		echo "arg".($k+1).": $v\n";
	}

}

foo();
/* prints nothing */

foo('hello');
/* prints
arg1: hello
*/

foo('hello', 'world', 'again');
/* prints
arg1: hello
arg2: world
arg3: again
*/
6

Ini adalah metode serialisasi asli dari PHP. Namun, sejak JSON telah menjadi begitu populer dalam beberapa tahun terakhir, mereka memutuskan untuk menambahkan dukungan untuknya di PHP 5.2. Sekarang Anda dapat menggunakan fungsi 

// get all php files AND txt files
$files = glob('*.{php,txt}', GLOB_BRACE);

print_r($files);
/* output looks like:
Array
(
    [0] => phptest.php
    [1] => pi.php
    [2] => post_output.php
    [3] => test.php
    [4] => log.txt
    [5] => test.txt
)
*/
2 dan 
// get all php files AND txt files
$files = glob('*.{php,txt}', GLOB_BRACE);

print_r($files);
/* output looks like:
Array
(
    [0] => phptest.php
    [1] => pi.php
    [2] => post_output.php
    [3] => test.php
    [4] => log.txt
    [5] => test.txt
)
*/
3 juga:

// yes, the argument list can be empty
function foo() {

	// returns an array of all passed arguments
	$args = func_get_args();

	foreach ($args as $k => $v) {
		echo "arg".($k+1).": $v\n";
	}

}

foo();
/* prints nothing */

foo('hello');
/* prints
arg1: hello
*/

foo('hello', 'world', 'again');
/* prints
arg1: hello
arg2: world
arg3: again
*/
7

Ini lebih kompak, dan yang terbaik dari semuanya, kompatibel dengan javascript dan banyak bahasa lainnya. Namun, untuk objek-objek yang kompleks, beberapa informasi yang mungkin akan hilang.


8. Mengompresi String

Ketika berbicara tentang kompresi, kita biasanya berpikir tentang file, seperti arsip ZIP. Ini dimungkinkan untuk mengompres string panjang dalam PHP, tanpa melibatkan setiap file arsip.

Dalam contoh berikut kita akan menggunakan fungsi gzcompress() dan gzuncompress():

// yes, the argument list can be empty
function foo() {

	// returns an array of all passed arguments
	$args = func_get_args();

	foreach ($args as $k => $v) {
		echo "arg".($k+1).": $v\n";
	}

}

foo();
/* prints nothing */

foo('hello');
/* prints
arg1: hello
*/

foo('hello', 'world', 'again');
/* prints
arg1: hello
arg2: world
arg3: again
*/
8

Kami mampu mencapai pengurangan ukuran hampir 50%. Juga fungsi gzencode() dan gzdecode() mencapai hasil yang sama, dengan menggunakan berbagai algoritma kompresi.


9. Mendaftarkan Fungsi Shutdown

Ada sebuah fungsi yang disebut register_shutdown_function(), yang akan mengijinkan Anda menjalankan beberapa kode yang tepat sebelum skrip selesai dijalankan.

Bayangkan bahwa Anda ingin menangkap beberapa acuan statistik pada akhir eksekusi skrip, seperti berapa lama waktu yang dibutuhkan untuk menjalankannya:

// yes, the argument list can be empty
function foo() {

	// returns an array of all passed arguments
	$args = func_get_args();

	foreach ($args as $k => $v) {
		echo "arg".($k+1).": $v\n";
	}

}

foo();
/* prints nothing */

foo('hello');
/* prints
arg1: hello
*/

foo('hello', 'world', 'again');
/* prints
arg1: hello
arg2: world
arg3: again
*/
9

Pada awalnya ini mungkin tampak sepele. Anda hanya menambahkan kodenya ke bagian paling bawah dari skrip dan dijalankan sebelum selesai. Namun, jika Anda pernah memanggil fungsi exit(), kode itu tidak akan pernah berjalan. Juga, jika ada kesalahan fatal, atau jika skrip dihentikan oleh pengguna (dengan menekan tombol Stop di browser), lagi-lagi itu tidak dapat berjalan.

Ketika Anda menggunakan register_shutdown_function(), kode Anda akan mengeksekusi tidak peduli mengapa skrip ini telah berhenti berjalan:

// get all php files
$files = glob('*.php');

print_r($files);
/* output looks like:
Array
(
    [0] => phptest.php
    [1] => pi.php
    [2] => post_output.php
    [3] => test.php
)
*/
0

Kesimpulan

Apakah Anda menyadari fitur-fitur PHP lainnya yang tidak banyak diketahui tetapi dapat cukup berguna? Silakan berbagi dengan kami di komentar. Dan terima kasih untuk membaca!