Saya menemukan paket PECL ini disebut utas , tetapi belum ada rilis. Dan tidak ada yang muncul di situs web PHP.
Saya menemukan paket PECL ini disebut utas , tetapi belum ada rilis. Dan tidak ada yang muncul di situs web PHP.
Jawaban:
Tidak ada yang tersedia yang saya sadari. Hal terbaik berikutnya adalah dengan memiliki satu skrip mengeksekusi skrip lain melalui CLI, tapi itu agak sederhana. Tergantung pada apa yang Anda coba lakukan dan seberapa kompleksnya, ini mungkin atau mungkin bukan opsi.
Dari manual PHP untuk ekstensi pthreads :
pthreads adalah Object Orientated API yang memungkinkan pengguna-lahan multi-threading di PHP. Ini mencakup semua alat yang Anda butuhkan untuk membuat aplikasi multi-utas yang ditargetkan di Web atau Konsol. Aplikasi PHP dapat membuat, membaca, menulis, mengeksekusi, dan menyinkronkan dengan Threads, Workers and Stackables.
Tidak bisa dipercaya kedengarannya, ini sepenuhnya benar. Hari ini, PHP dapat multi-utas bagi mereka yang ingin mencobanya.
Rilis pertama PHP4, 22 Mei 2000, PHP dikirim dengan arsitektur thread thread - cara untuk mengeksekusi beberapa contoh penerjemahnya di utas terpisah di lingkungan SAPI (Server API) multi-utas. Selama 13 tahun terakhir, desain arsitektur ini telah dipertahankan dan maju: Ini telah digunakan dalam produksi di situs web terbesar di dunia sejak itu.
Threading di tanah pengguna tidak pernah menjadi perhatian bagi tim PHP, dan tetap seperti sekarang ini. Anda harus memahami bahwa di dunia di mana PHP menjalankan bisnisnya, sudah ada metode penskalaan yang ditentukan - tambahkan perangkat keras. Selama bertahun-tahun PHP telah ada, perangkat keras menjadi lebih murah dan lebih murah sehingga ini menjadi kurang dan kurang menjadi perhatian bagi tim PHP. Meskipun semakin murah, ia juga menjadi jauh lebih kuat; hari ini, ponsel dan tablet kami memiliki arsitektur dual dan quad core dan banyak RAM yang harus disertakan, desktop dan server kami umumnya memiliki 8 atau 16 core, 16 dan 32 gigabytes RAM, meskipun kami mungkin tidak selalu dapat memiliki dua sesuai anggaran dan memiliki dua desktop jarang berguna bagi kebanyakan dari kita.
Selain itu, PHP ditulis untuk non-programmer, itu adalah banyak penggemar bahasa asli. Alasan PHP sangat mudah diadopsi adalah karena itu adalah bahasa yang mudah dipelajari dan ditulis. Alasan PHP sangat dapat diandalkan hari ini adalah karena banyaknya pekerjaan yang masuk ke dalam desain itu, dan setiap keputusan dibuat oleh grup PHP. Ini keandalan dan kebesaran semata-mata menyimpannya dalam sorotan, setelah bertahun-tahun; di mana saingannya jatuh ke waktu atau tekanan.
Pemrograman multi-utas tidak mudah untuk sebagian besar, bahkan dengan API yang paling koheren dan dapat diandalkan, ada beberapa hal yang berbeda untuk dipikirkan, dan banyak kesalahpahaman. Grup PHP tidak berharap pengguna darat multi-threading menjadi fitur inti, tidak pernah diberi perhatian serius - dan memang demikian. PHP seharusnya tidak rumit, untuk semua orang.
Semua hal dipertimbangkan, masih ada manfaat yang bisa didapat dari memungkinkan PHP untuk memanfaatkan fitur siap produksi dan teruji untuk memungkinkan cara memaksimalkan apa yang kita miliki, ketika menambahkan lebih banyak tidak selalu menjadi pilihan, dan banyak tugas tidak pernah benar-benar dibutuhkan.
pthreads mencapai, bagi mereka yang ingin menjelajahinya, sebuah API yang memungkinkan pengguna untuk aplikasi PHP multi-thread. Itu API sangat banyak pekerjaan dalam proses, dan ditunjuk tingkat beta stabilitas dan kelengkapan.
Sudah menjadi rahasia umum bahwa beberapa perpustakaan menggunakan PHP tidak aman thread, itu harus jelas kepada programmer bahwa pthreads tidak dapat mengubah ini, dan tidak mencoba untuk mencoba. Namun, perpustakaan apa pun yang aman utas dapat digunakan, seperti dalam pengaturan utas lainnya dari penerjemah.
pthreads menggunakan Posix Threads (bahkan di Windows), apa yang dibuat oleh programmer adalah utas eksekusi nyata, tetapi agar utas tersebut bermanfaat, mereka harus menyadari PHP - mampu mengeksekusi kode pengguna, berbagi variabel, dan memungkinkan alat komunikasi yang berguna (sinkronisasi). Jadi setiap utas dibuat dengan instance dari juru bahasa, tetapi dengan desain, juru itu diisolasi dari semua contoh lain dari juru bahasa - seperti lingkungan Server API multi-utas. pthreads berupaya menjembatani kesenjangan dengan cara yang waras dan aman. Banyak kekhawatiran dari programmer threads di C hanya tidak ada untuk programmer dari pthreads, secara desain, pthreads adalah copy pada read dan copy on write (RAM murah), jadi tidak ada dua contoh yang pernah memanipulasi data fisik yang sama , tetapi keduanya dapat memengaruhi data di utas lainnya.
Mengapa menyalin saat dibaca dan menyalin saat menulis:
public function run() {
...
(1) $this->data = $data;
...
(2) $this->other = someOperation($this->data);
...
}
(3) echo preg_match($pattern, $replace, $thread->data);
(1) Ketika kunci baca dan tulis ditahan pada penyimpanan data objek pthreads, data disalin dari lokasi aslinya dalam memori ke penyimpanan objek. pthreads tidak menyesuaikan refcount variabel, Zend dapat membebaskan data asli jika tidak ada referensi lebih lanjut.
(2) Argumen untuk beberapa operasi referensi objek menyimpan, data asli yang disimpan, yang itu sendiri merupakan salinan hasil (1), disalin lagi untuk mesin ke dalam wadah zval, sementara ini terjadi kunci baca diadakan pada toko objek, kunci dilepaskan dan mesin dapat menjalankan fungsi. Ketika zval dibuat, ia memiliki penghitungan ulang 0, memungkinkan mesin untuk membebaskan salinan pada selesainya operasi, karena tidak ada referensi lain untuk itu ada.
(3) Argumen terakhir untuk preg_match referensi menyimpan data, kunci baca diperoleh, set data dalam (1) disalin ke zval, lagi dengan refcount dari 0. Kunci dilepaskan, Panggilan untuk preg_match beroperasi pada salinan data, itu sendiri merupakan salinan dari data asli.
Hal yang perlu diketahui:
Tabel hash toko objek di mana data disimpan, aman thread,
didasarkan pada TsHashTable dikirimkan dengan PHP, oleh Zend.
Toko objek memiliki kunci baca dan tulis, kunci akses tambahan disediakan untuk TsHashTable sehingga jika diperlukan (dan memang diperlukan, var_dump / print_r, akses langsung ke properti ketika mesin PHP ingin merujuknya) pthreads dapat memanipulasi TsHashTable di luar API yang ditentukan.
Kunci hanya ditahan saat operasi penyalinan terjadi, ketika salinan telah dibuat kunci dilepaskan, dalam urutan yang masuk akal.
Ini berarti:
Ketika menulis terjadi, tidak hanya kunci baca dan tulis ditahan, tetapi kunci akses tambahan. Tabel itu sendiri dikunci, tidak mungkin konteks lain dapat mengunci, membaca, menulis atau memengaruhinya.
Ketika pembacaan terjadi, tidak hanya kunci baca dipegang, tetapi kunci akses tambahan juga, lagi meja dikunci.
Tidak ada dua konteks yang secara fisik maupun bersamaan dapat mengakses data yang sama dari penyimpanan objek, tetapi penulisan yang dibuat dalam konteks apa pun dengan referensi akan memengaruhi data yang dibaca dalam konteks apa pun dengan referensi.
Ini tidak dibagikan arsitektur apa pun dan satu-satunya cara untuk ada adalah berdampingan. Mereka yang sedikit mengerti akan melihat itu, ada banyak penyalinan yang terjadi di sini, dan mereka akan bertanya-tanya apakah itu hal yang baik. Cukup banyak penyalinan berlangsung dalam runtime dinamis, itulah dinamika bahasa dinamis. pthreads diimplementasikan pada level objek, karena kontrol yang baik dapat diperoleh atas satu objek, tetapi metode - kode yang dieksekusi programmer - memiliki konteks lain, bebas dari penguncian dan salinan - lingkup metode lokal. Cakupan objek dalam kasus objek pthreads harus diperlakukan sebagai cara untuk berbagi data di antara konteks, yaitu tujuannya. Dengan pemikiran ini Anda dapat mengadopsi teknik untuk menghindari mengunci toko objek kecuali itu perlu,
Sebagian besar perpustakaan dan ekstensi yang tersedia untuk PHP adalah pembungkus tipis di sekitar pihak ke-3, fungsionalitas inti PHP pada tingkat yang sama. pthreads bukan pembungkus tipis di sekitar Posix Threads; itu adalah threading API berdasarkan Posix Threads. Tidak ada gunanya mengimplementasikan Threads di PHP yang pengguna tidak mengerti atau tidak bisa menggunakannya. Tidak ada alasan bahwa seseorang yang tidak memiliki pengetahuan tentang apa itu mutex atau tidak seharusnya tidak dapat mengambil keuntungan dari semua yang mereka miliki, baik dalam hal keterampilan, dan sumber daya. Objek berfungsi seperti objek, tetapi di mana pun dua konteks akan bertabrakan, pthreads memberikan stabilitas dan keamanan.
Siapa pun yang telah bekerja di java akan melihat kesamaan antara objek pthreads dan threading di java, orang-orang yang sama tidak akan ragu melihat kesalahan yang disebut ConcurrentModificationException - karena terdengar kesalahan yang ditimbulkan oleh runtime java jika dua utas menulis data fisik yang sama secara bersamaan. Saya mengerti mengapa itu ada, tetapi membingungkan saya bahwa dengan sumber daya semurah mereka, ditambah dengan fakta runtime mampu mendeteksi konkurensi pada waktu yang tepat dan hanya keamanan yang dapat dicapai untuk pengguna, yang ia pilih untuk melempar kesalahan yang mungkin fatal saat runtime daripada mengelola eksekusi dan akses ke data.
Tidak ada kesalahan bodoh yang akan dipancarkan oleh pthreads, API ditulis untuk membuat threading stabil, dan kompatibel mungkin, saya percaya.
Multi-threading tidak seperti menggunakan database baru, perhatian harus diberikan kepada setiap kata dalam manual dan contoh yang dikirimkan dengan pthreads.
Terakhir, dari manual PHP:
pthreads dulu adalah eksperimen dengan hasil yang cukup bagus. Setiap batasan atau fitur dapat berubah sewaktu-waktu; itulah sifat eksperimen. Keterbatasan - sering dipaksakan oleh implementasi - ada karena alasan yang baik; Tujuan dari pthreads adalah untuk memberikan solusi yang dapat digunakan untuk multi-tasking di PHP di level apa pun. Dalam lingkungan yang dijalankan oleh pthread, beberapa pembatasan dan pembatasan diperlukan untuk menyediakan lingkungan yang stabil.
Berikut adalah contoh dari apa yang disarankan Wilco:
$cmd = 'nohup nice -n 10 /usr/bin/php -c /path/to/php.ini -f /path/to/php/file.php action=generate var1_id=23 var2_id=35 gen_id=535 > /path/to/log/file.log & echo $!';
$pid = shell_exec($cmd);
Pada dasarnya ini mengeksekusi skrip PHP di baris perintah, tetapi segera mengembalikan PID dan kemudian berjalan di latar belakang. (Gema $! Memastikan tidak ada lagi yang dikembalikan selain PID.) Ini memungkinkan skrip PHP Anda untuk melanjutkan atau keluar jika Anda mau. Ketika saya telah menggunakan ini, saya telah mengalihkan pengguna ke halaman lain, di mana setiap 5 hingga 60 detik panggilan AJAX dilakukan untuk memeriksa apakah laporan masih berjalan. (Saya punya tabel untuk menyimpan gen_id dan pengguna yang terkait dengannya.) Skrip periksa menjalankan yang berikut:
exec('ps ' . $pid , $processState);
if (count($processState) < 2) {
// less than 2 rows in the ps, therefore report is complete
}
Ada posting singkat tentang teknik ini di sini: http://nsaunders.wordpress.com/2007/01/12/running-a-background-process-in-php/
Singkatnya: ya, ada multithreading di php tetapi Anda harus menggunakan multiprocessing.
Selalu ada sedikit kebingungan tentang perbedaan utas dan proses, jadi saya akan segera menjelaskan keduanya:
Anda dapat mencapai komputasi paralel dengan membuat proses baru (yang juga berisi utas baru) dengan php. Jika utas Anda tidak memerlukan banyak komunikasi atau sinkronisasi, ini adalah pilihan Anda, karena prosesnya terisolasi dan tidak dapat mengganggu pekerjaan masing-masing. Bahkan jika satu crash, itu tidak menjadi perhatian yang lain. Jika Anda memang membutuhkan banyak komunikasi, Anda harus membaca di "multithreading" atau - sayangnya - pertimbangkan untuk menggunakan bahasa pemrograman lain, karena komunikasi antar-proses dan sinkronisasi menghadirkan banyak corak.
Di php Anda memiliki dua cara untuk membuat proses baru:
biarkan OS yang melakukannya untuk Anda : Anda dapat memberi tahu sistem operasi Anda untuk membuat proses baru dan menjalankan skrip php baru (atau yang sama) di dalamnya.
untuk linux Anda dapat menggunakan yang berikut atau mempertimbangkan jawaban Darryl Hein :
$cmd = 'nice php script.php 2>&1 & echo $!';
pclose(popen($cmd, 'r'));
untuk windows Anda dapat menggunakan ini:
$cmd = 'start "processname" /MIN /belownormal cmd /c "script.php 2>&1"';
pclose(popen($cmd, 'r'));
lakukan sendiri dengan fork : php juga menyediakan kemungkinan untuk menggunakan forking melalui fungsi pcntl_fork () . Tutorial yang baik tentang cara melakukan ini dapat ditemukan di sini tetapi saya sangat menyarankan untuk tidak menggunakannya, karena garpu adalah kejahatan terhadap kemanusiaan dan terutama terhadap oop.
Dengan multithreading, semua utas Anda membagikan sumber dayanya sehingga Anda dapat dengan mudah berkomunikasi di antara dan menyinkronkannya tanpa banyak overhead. Di sisi lain Anda harus tahu apa yang Anda lakukan, karena kondisi balapan dan kebuntuan mudah dibuat tetapi sangat sulit untuk di-debug.
Php standar tidak menyediakan multithreading tetapi ada ekstensi (percobaan) yang sebenarnya - pthreads . Dokumentasi apinya bahkan membuatnya menjadi php.net . Dengan itu Anda dapat melakukan beberapa hal yang Anda bisa dalam bahasa pemrograman nyata :-) seperti ini:
class MyThread extends Thread {
public function run(){
//do something time consuming
}
}
$t = new MyThread();
if($t->start()){
while($t->isRunning()){
echo ".";
usleep(100);
}
$t->join();
}
Untuk linux ada panduan instalasi di sini di stackoverflow.
Untuk windows ada satu sekarang:
Edit [phpDirectory] /php.ini dan masukkan baris berikut
extension=php_pthreads.dll
Uji dengan naskah di atas dengan beberapa tidur atau sesuatu di sana di mana komentar itu.
Dan sekarang NAMUN besar : Meskipun ini benar-benar berfungsi, php pada awalnya tidak dibuat untuk multithreading. Ada versi php-thread-safe dan pada v5.4 tampaknya hampir bebas bug tetapi menggunakan php di lingkungan multi-threaded masih berkecil hati dalam manual php (tapi mungkin mereka hanya tidak memperbarui manual mereka di ini, belum). Masalah yang jauh lebih besar mungkin banyak ekstensi umum tidak aman thread . Jadi Anda mungkin mendapatkan utas dengan ekstensi php ini tetapi fungsi yang Anda andalkan masih tidak aman, jadi Anda mungkin akan menghadapi kondisi balapan, kebuntuan, dan sebagainya dalam kode yang tidak Anda tulis sendiri ...
Anda dapat menggunakan pcntl_fork () untuk mencapai sesuatu yang mirip dengan utas. Secara teknis ini adalah proses yang terpisah, jadi komunikasi antara keduanya tidak sesederhana dengan utas, dan saya percaya itu tidak akan berfungsi jika PHP disebut dengan apache.
Jika ada yang peduli, saya telah menghidupkan kembali php_threading (tidak sama dengan utas, tetapi serupa) dan saya benar-benar memilikinya ke titik di mana ia bekerja (agak) dengan baik!
pcntl_fork()
adalah apa yang Anda cari, tetapi proses forking-nya tidak threading. sehingga Anda akan memiliki masalah pertukaran data. untuk menyelesaikannya, Anda dapat menggunakan fungsi semaphore phps ( http://www.php.net/manual/de/ref.sem.php ) antrian pesan mungkin sedikit lebih mudah untuk permulaan daripada segmen memori bersama.
Bagaimanapun, strategi yang saya gunakan dalam kerangka kerja web yang sedang saya kembangkan yang memuat blok sumber daya intensif halaman web (mungkin dengan permintaan eksternal) paralel: saya sedang melakukan antrian pekerjaan untuk mengetahui data apa yang saya tunggu dan kemudian saya garpu dari pekerjaan untuk setiap proses. Setelah selesai mereka menyimpan data mereka dalam cache apc di bawah kunci unik yang dapat diakses oleh proses induk. begitu setiap data ada di sana, hal itu berlanjut. saya menggunakan sederhana,usleep()
untuk menunggu karena komunikasi antar proses tidak mungkin di apache (anak-anak akan kehilangan koneksi ke orang tua mereka dan menjadi zombie ...). jadi ini membawa saya ke hal terakhir: penting untuk bunuh diri setiap anak! ada juga kelas yang memproses proses tetapi menyimpan data, saya tidak memeriksanya tetapi kerangka kerja zend memilikinya, dan mereka biasanya melakukan kode yang lambat namun andal. Anda dapat menemukannya di sini:
http://zendframework.com/manual/1.9/en/zendx.console.process.unix.overview.html
saya pikir mereka menggunakan segmen shm! well last but not least ada kesalahan pada situs web zend ini, kesalahan kecil dalam contoh.
while ($process1->isRunning() && $process2->isRunning()) {
sleep(1);
}
should of course be:
while ($process1->isRunning() || $process2->isRunning()) {
sleep(1);
}
Ada ekstensi Threading yang sedang dikembangkan berdasarkan PThreads yang terlihat sangat menjanjikan di https://github.com/krakjoe/pthreads
Hanya pembaruan, sepertinya orang-orang PHP bekerja pada utas pendukung dan sekarang tersedia.
Berikut tautannya: http://php.net/manual/en/book.pthreads.php
Saya memiliki kelas threading PHP yang telah berjalan dengan sempurna di lingkungan produksi selama lebih dari dua tahun sekarang.
EDIT: Ini sekarang tersedia sebagai perpustakaan komposer dan sebagai bagian dari kerangka kerja MVC saya, Hazaar MVC.
Saya tahu ini adalah pertanyaan lama, tetapi Anda dapat melihat http://phpthreadlib.sourceforge.net/
Komunikasi dua arah, dukungan untuk Win32, dan tidak perlu ekstensi.
Pernah dengar appserver
dari techdivision?
Itu ditulis dalam php dan berfungsi sebagai appserver mengelola multithreads untuk aplikasi php lalu lintas tinggi. Masih dalam versi beta tetapi sangat menjanjikan.
Ada yang agak kabur, dan segera ditinggalkan, fitur yang disebut kutu . Satu-satunya hal yang pernah saya gunakan untuk itu, adalah untuk memungkinkan skrip untuk menangkap SIGKILL (Ctrl + C) dan menutup dengan anggun.
pcntl_fork()
) akan berfungsi jika dipanggil dari Apache?