Apakah PHP memiliki threading?

130

Saya menemukan paket PECL ini disebut utas , tetapi belum ada rilis. Dan tidak ada yang muncul di situs web PHP.

Thomas Owens
sumber
Adakah yang tahu apakah ini ( pcntl_fork()) akan berfungsi jika dipanggil dari Apache?
Josh K
Ini sangat tua, tapi saya punya jawaban yang sebenarnya menyediakan threading di php (lihat tautan di bawah).
Alec Gorge
Mereka merekomendasikan untuk tidak memanggil garpu dari lingkungan server. Saya tidak menyalahkan mereka. Namun, pcntl_fork tampaknya menjadi solusi terbaik untuk threading PHP.
just_wes
Ya, Anda tidak perlu melakukan proses php apache2.
andho
2
Gunakan pthreads bekerja seperti pesona
Baba

Jawaban:

40

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.

Wilco
sumber
1
Itulah yang saya pikir. Saya melihat banyak posting lama mengatakan tidak, dan tidak ada di php.net, jadi ini adalah pikiran saya. Terima kasih sudah mengkonfirmasi.
Thomas Owens
2
Ya, paket PECL itu agak menggoda - saya berlari melewatinya juga tetapi tidak ada yang datang darinya.
Wilco
180

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.

Joe Watkins
sumber
14
Omong kosong.
Joe Watkins
7
@ GeoC. Saya bahkan tidak yakin apa maksud Anda di sini, itu hanya omong kosong dan Anda tidak memberikan alasan , logis atau sebaliknya, mengapa Anda tidak setuju dengan argumen apa pun (yang saya tidak bisa melihatnya di pos) .
Jimbo
13
@Tudor Saya tidak berpikir Anda benar-benar tahu apa yang Anda bicarakan, jadi saya senang mengabaikan Anda.
Joe Watkins
4
@Tudor - banyak ilmuwan tidak "melihat titik" dari sesuatu yang baru di cabang mereka, atau sesuatu yang bermanfaat. Sejarah telah menunjukkan bahwa lebih sering daripada tidak, orang-orang seperti Anda salah, itu fakta. Sama seperti fakta bahwa semua yang Anda tulis di sini adalah, tanpa kata yang lebih baik, feses. Saya sangat menyarankan, dengan segala sesuatu yang positif dalam pikiran, untuk tidak mengambil bagian dalam topik yang tidak Anda ketahui (yang ini).
NB
12
Hal yang lucu. Joe Watkins adalah penulis pthreads, dan Tudor masih mencoba membuktikan bahwa dia salah.
Hristo Valkanov
48

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/

Darryl Hein
sumber
saya punya sedikit masalah, bagaimana Anda memeriksa status proses latar belakang? bisakah kamu mencerahkan saya
slier
25

Singkatnya: ya, ada multithreading di php tetapi Anda harus menggunakan multiprocessing.

Info backgroud: utas vs. proses

Selalu ada sedikit kebingungan tentang perbedaan utas dan proses, jadi saya akan segera menjelaskan keduanya:

  • Sebuah benang adalah urutan perintah yang CPU akan memproses. Satu-satunya data yang dikandungnya adalah penghitung program. Setiap inti CPU hanya akan memproses satu utas pada satu waktu tetapi dapat beralih di antara pelaksanaan yang berbeda melalui penjadwalan.
  • Suatu proses adalah seperangkat sumber daya bersama. Itu berarti terdiri dari bagian memori, variabel, instance objek, file handle, mutexes, koneksi basis data dan sebagainya. Setiap proses juga mengandung satu atau lebih utas. Semua utas dari proses yang sama membagikan sumber dayanya, jadi Anda dapat menggunakan variabel di satu utas yang Anda buat di utas lainnya. Jika utas tersebut adalah bagian dari dua proses yang berbeda, maka mereka tidak dapat mengakses sumber daya satu sama lain secara langsung. Dalam hal ini Anda memerlukan komunikasi antar-proses melalui mis pipa, file, soket ...

Multiprocessing

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.

Multithreading

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:

  • Pertama, Anda memerlukan versi php-thread-safe.
  • Anda memerlukan versi pra-kompilasi dari kedua pthreads dan ekstensi php-nya. Mereka dapat diunduh di sini . Pastikan Anda mengunduh versi yang kompatibel dengan versi php Anda.
  • Salin php_pthreads.dll (dari zip yang baru saja Anda unduh) ke folder ekstensi php Anda ([phpDirectory] / ext).
  • Salin pthreadVC2.dll ke [phpDirectory] (folder root - bukan folder ekstensi).
  • 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 ...

Francois Bourgeois
sumber
5
Itu sangat salah, artikel yang Anda referensikan adalah dari 2008. Jika PHP bukan utas yang aman pada intinya, artikel itu tidak akan di-threaded modul SAPI.
Joe Watkins
1
@ Jo: Baiklah, saya mengubahnya pada intinya adalah thread-safe tetapi banyak ekstensi tidak.
Francois Bourgeois
1
Banyak ? Saya pikir Anda akan menemukan itu sangat sedikit, Anda telah menemukan dokumentasi tetapi gagal membacanya dengan benar: Catatan: Yang ditandai dengan * bukan perpustakaan thread-safe, dan tidak boleh digunakan dengan PHP sebagai modul server di multi Server web Windows yang teralisir (IIS, Netscape). Ini tidak masalah di lingkungan Unix, belum.
Joe Watkins
6
PHP sangat aman untuk digunakan, dan sudah bertahun-tahun, beberapa perpustakaan eksternal dan beberapa yang dibundel tidak, tetapi didokumentasikan dengan baik, dan cukup jelas. pthreads membuat utas yang aman seperti utas yang dibuat oleh zend di sapi multi-utas, saya tahu ini, karena saya, sendirian, menulis pthreads. Menggunakan setiap API yang tersedia yang diekspos oleh PHP seperti halnya API server, saya tidak mengatakan itu benar-benar stabil, tetapi gambar yang telah Anda lukis benar-benar salah dan kurang informasi.
Joe Watkins
@ Jo: Ketika manual mengatakan ini tidak masalah untuk lingkungan Unix mereka mengacu pada fakta bahwa pada sistem Unix apache menggunakan beberapa proses dan pada Windows itu menggunakan utas. Jadi pada dasarnya mereka mengatakan "jika Anda tidak menggunakan utas, Anda tidak perlu khawatir tentang ekstensi yang tidak aman." Ketika kita menggunakan utas dengan pthreads, itu - tentu saja - juga berpengaruh pada lingkungan Unix.
Francois Bourgeois
17

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.

davr
sumber
4
Saya berhasil menggunakan pcntl_fork untuk memparalelkan tugas impor data yang cukup besar. Bekerja dengan baik, dan saya membuatnya bekerja dalam waktu sekitar satu jam. Ada sedikit kurva pembelajaran, tetapi begitu Anda memahami apa yang sedang terjadi, itu cukup mudah.
Frank Farmer
Frank, apakah itu dengan PHP CLI atau apache PHP?
Artem Russakovskii
@ Artem: Saya juga ingin tahu.
Josh K
5
@ Frank Farmer menggoda kita ... sama seperti paket PECL.
Roger
1
Saya menggunakan pcntl_fork dengan CLI. Saya belum pernah mencobanya di apache; itu terdengar berisiko. Bahkan pada CLI, ada beberapa masalah yang tidak terduga. Saya tampaknya memiliki masalah di mana jika seorang anak menutup pegangan basis data (karena pekerjaannya selesai), itu juga menutup koneksi untuk saudara kandung. Karena anak-anak adalah salinan dari orang tua, bersiaplah untuk keanehan. Sejak itu saya telah mendesain ulang kode saya untuk hanya memunculkan proses baru, benar-benar terpisah melalui exec () - lebih bersih seperti itu.
Frank Farmer
7

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);
}
The Surrican
sumber
6

Ada ekstensi Threading yang sedang dikembangkan berdasarkan PThreads yang terlihat sangat menjanjikan di https://github.com/krakjoe/pthreads

JasonDavis
sumber
5

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.

Lihat: https://git.hazaarlabs.com/hazaar/hazaar-thread

Jamie Carl
sumber
Bagaimana jika, mengikuti contoh Anda, program di file.php, katakanlah misalnya, sangat memenuhi keberadaan daftar uris situs web 10k dan kemudian harus menyimpan hasilnya dalam file CSV ... Apakah pengajuan file ini menjadi masalah?
Roger
Sub proses akan berjalan sebagai pengguna yang sama dengan skrip web-server / induk. Jadi Saat menulis file, Anda akan memiliki pertimbangan yang sama tentang izin seperti biasanya. Jika Anda memiliki masalah dalam menulis file, cobalah menulis ke / tmp dan ketika itu berfungsi, pergi dari sana.
Jamie Carl
1
Tautan ini sekarang mati karena didesain ulang, Anda bisa mendapatkannya di mesin jalan kembali di sini: web.archive.org/web/20130922043615/http://dev.funkynerd.com/…
Tony
Ditambahkan ke kerangka kerja MVC saya sekarang. Lihat: git.hazaarlabs.com/hazaar/hazaar-thread
Jamie Carl
1

Pernah dengar appserverdari techdivision?

Itu ditulis dalam php dan berfungsi sebagai appserver mengelola multithreads untuk aplikasi php lalu lintas tinggi. Masih dalam versi beta tetapi sangat menjanjikan.

pengguna2627170
sumber
-3

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.

troelskn
sumber
3
Kutu tidak dieksekusi secara paralel. Intinya, setelah setiap pernyataan, fungsi tick Anda berjalan. Saat fungsi centang Anda berjalan, kode utama tidak berjalan.
Frank Farmer
1
kutu hanya diperlukan untuk penangan sinyal ().
Nick