PHP: bagaimana agar I / O dapat diakses oleh orang tua setelah anak pcntl_fork () selesai?

0

Saya menggunakan PHP dan pcntl_fork (). Idenya adalah bahwa orang tua memotong dan berhenti untuk menyelesaikan anak; anak melakukan tugas kemudian berakhir; orang tua dapat memeriksa kode pengembalian untuk tugas atau status proses anak dan melanjutkan sesuai itu.

(Tugas diisolasi dari induk utama dengan forking, untuk memastikan orang tua dapat membersihkan dengan baik jika tugas tersebut mengenai masalah runtime yang tidak dapat diperbaiki, seperti file "termasuk" yang rusak atau pustaka kunci yang hilang, maka dari fork, pada dasarnya saya mengimplementasikan isolasi proses sederhana untuk kejadian yang mudah-mudahan jarang terjadi, kondisi yang tidak dapat diperbaiki dapat menyebabkan masalah)

Jadi masalahnya adalah bahwa setelah pcntl_fork () kedua proses berbagi deskriptor I / O STDXXX yang sama, sehingga segera setelah anak menyelesaikan tugasnya, I / O yang digunakan tertutup seperti biasa, dan mereka ditutup untuk orangtua sebagai baik, artinya hal-hal seperti echo () yang digunakan untuk melanjutkan interaksi oleh orang tua, tiba-tiba berhenti bekerja juga.

Saya mengikuti tip di php.net dan menggunakan posix kill -9 pada anak alih-alih keluar, sehingga anak berakhir tanpa menutup IO yang dibagikan dengan (dan dibutuhkan oleh) induknya, tetapi apakah ada cara yang lebih rapi untuk melakukan ini ?

Terima kasih!

Stilez
sumber
Hmm, deskriptor file Unix adalah tidak dibagikan melintasi fork (), dan tidak ada objek PHP IO ... Jadi penyebabnya lebih kompleks dari itu.
grawity

Jawaban:

0

Sebelum pcntl_fork() Anda dapat "dup" file deskriptor file yang diinginkan dengan membuka misalnya php://stdout dan php://stderr, atau php://fd/3. Lihat php protokol .


Perhatikan bahwa ketika seorang anak menutup deskriptor file, itu adalah tidak ditutup pada induknya. Setelah garpu proses berbagi sama penunjuk untuk membuka file, tetapi Anda masih dapat menggema dari orang tua setelah anak keluar.

meuh
sumber
Ini kedengarannya menjanjikan, tetapi area seperti sesi dan manipulasi yang diperlukan dari deskriptor STDXXX dup'ed sedikit di luar area pengetahuan saya saat ini dan halaman (di php.net dan opengropup.org) tidak sejelas bagi saya seperti saya harapan. Bisakah Anda menjelaskan bagaimana melakukan ini dengan contoh "garis besar" pendek? Itu akan banyak membantu.
Stilez
@Stilez membaca ulang posting Anda, saya tidak yakin mengapa Anda harus melakukan sesuatu yang istimewa close() pada anak tidak mempengaruhi salinan orang tua dari deskriptor file. pcntl_fork() seharusnya memanggil sistem nyata fork() yang efektif dup() pada file yang terbuka.
meuh
Saya melihat tetapi sepertinya php.net tidak mengenali close () sebagai sebuah perintah? Yang jelas adalah bahwa ketika saya mengganti exit () atau die () pada anak dengan POSIX self-kill -9 orang tua dapat melanjutkan output dengan gema, ketika saya tidak bisa, jadi pembersihan selama anak normal yang keluar harus entah bagaimana menutup atau memengaruhi deskriptor STDXXX yang digunakan oleh orang tua. Mungkinkah memposting garis besar cara untuk keluar dari anak secara berbeda, atau menggandakan atau "memisahkan" deskriptor sehingga anak yang keluar tidak memiliki efek itu? Itu akan sangat membantu.
Stilez
@ Stilez Saya mencoba cgi kecil dengan anak yang keluar, dan orang tua dapat terus melakukan gema (dengan PHP / 5.5.24 di linux), jadi saya tidak bisa membantu lebih jauh dengan situasi Anda. Mungkin anak Anda mengirim kembali a Content-Length: sundulan dengan jumlah byte yang ditulis anak. Sebagian besar browser akan menghargai panjang ini dan tidak membacanya, bahkan jika php induknya berhasil menulis lebih banyak data.
meuh