proc_open Bir komutu çalıştırır ve G/Ç için bir dosya tanıtıcı açar &reftitle.description; resourcefalseproc_open arraystringkomut arraytanıtıcılar arraytanıtıcılar stringnulldizin&null; arraynullortam&null; arraynullseçenekler&null; proc_open işlevi, program çalıştırma konusunda daha geniş denetim imkanı sağlaması dışında popen gibidir. &reftitle.parameters; komut Bir dizge olarak çalıştırılacak komut. Özel karakterler uygun şekilde öncelenmeli ve uygun tırnaklama uygulanmalıdır. Windows üzerinde, seçenekler içinde bypass_shell &true; olmadıkça komut tırnaklı dizge olarak (yani, tam olarak proc_open işlevine belirtildiği gibi) /c seçeneğiyle cmd.exe'ye aktarılır (aslında, %ComSpec%). Bu cmd.exe'nin komut'taki sarmalayıcı tırnakları kaldırmasına sebep olur (ayrıntılar için cmd.exe belgelerine bakın), bu da istenmeyen ve daha tehlikeli olabilecek bir davranışla sonuçlanır, çünkü cmd.exe hata iletiler aktarılan komut'u (parçalarını) içerebilir (aşağıya bakınız). PHP 7.4.0'dan beri, komut bir komut bağımsız değişkenleri dizisi olarak aktarılabilmektedir. Bu durumda süreç doğrudan (kabuk üzerinden gitmeden) açılabilmekte ve gerekli bağımsız değişken öncelemesini PHP yapabilmektedir. Windows üzerinde, dizi elemanlarının bağımsız değişken öncelemesi, çalıştırılan komutun komut satırı çözümlemesinin, VC çalışma zamanında yapılan komut satırı bağımsız değişkenleri ayrıştırılması işlemiyle uyumlu olduğu varsayılır. tanıtıcılar İndisli bir dizi olup, indisler tanıtıcı numaralarını, değerler ise PHP'nin çocuk süreçlere bu tanıtıcıları nasıl aktaracağını gösterir. 0 indisi, standart girdi; 1 indisi, standart çıktı; 2 indisi ise standart hata içindir. Her eleman şunları içerebilir: Sürece aktarılacak boruyu tanımlayan bir dizi. İlk eleman tanıtıcı türü, ikincisi belirtilen türde bir seçenektir. Geçerli türler: pipe (ikinci eleman sürece okuma ucunu aktaran r veya yazma ucunu aktaran w olabilir) ve file (ikinci eleman bir dosya ismidir). w dışındaki herşeyin r gibi ele alınacağına dikkat edilmelidir. Gerçek bir dosya tanıtıcısına karşılık gelen bir akım özkaynağı (örneğin, STDIN, bir soket, açılmış bir dosya gibi). Dosya tanıtıcıları 0, 1 ve 2 ile sınırlı değildir; çocuk sürece aktarılmak üzere herhangi bir dosya tanıtıcı belirtebilirsiniz. Böylece, betiğiniz diğer betiklerin arasında bir yardımcı süreç olarak çalışabilir. Bu özellikle, güvenlikle ilgili konularda PGP, GPG ve openssl gibi programlara anahtar parolasını aktarmak için kullanışlıdır. Ayrıca, bu programlar tarafından yardımcı dosya tanıtıcılarıyla sağlanan durum bilgisini okumak için de kullanışlıdır. borular PHP'nin oluşturduğu boru uçlarına karşılık gelen dosya tanıtıcılarını içeren indisli bir dizi. dizin Komutun ilk çalıştırılacağı dizin. İlk çalıştırma dizini mutlak bir dosya yolu olabileceği gibi öntanımlı çalışma dizinini kullanmak isterseniz &null; da olabilir. Öntanımlı çalıştırma dizini PHP sürecinin çalıştırıldığı dizindir. ortam Çalıştırılacak komutun ortamına aktarılacak ortam değişkenleri dizisi. PHP süreci ile aynı ortamı kullanmak isterseniz &null; belirtebilirsiniz. seçenekler Ek seçenekler belirtme imkanı sunar. Olası seçenekler: suppress_errors (sadece windows): Değer olarak &true; belirtilirse bu işlev tarafından üretilen hatalar baskılanır. bypass_shell (sadece windows): Değer olarak &true; belirtilirse cmd.exe kabuğu es geçilir. blocking_pipes (sadece windows): &true; atandığında boruların engellenmesi zorlanır. create_process_group (sadece windows): &true; atandığında CTRL olaylarının çocuk süreç tarafından işlenmesini sağlar. create_new_console (sadece windows): Ebeveynin konsolunu miras almak yerine yeni sürece yeni bir konsol açılır. &reftitle.returnvalues; Süreci ifade eden bir özkaynak döner. Bu özkaynak ile işiniz bittiğinde proc_close ile serbest bırakmalısınız. Hata durumunda işlev &false; döndürür. &reftitle.changelog; &Version; &Description; 7.4.4 seçenekler bağımsız değişkenine create_new_console seçeneği eklendi. 7.4.0 proc_open artık komut bağımsız değişkeninde bir dizi de kabul edebiliyor. 7.4.0 seçenekler bağımsız değişkenine create_process_group seçeneği eklendi. &reftitle.examples; - <function>proc_open</function> örneği array("pipe", "r"), // stdin, alt sürecin okuyacağı borudur 1 => array("pipe", "w"), // stdout, alt sürecin yazacağı borudur 2 => array("file", "/tmp/hatalar", "a") // stderr çıktısı bu dosyaya yazılır ); $dizin = '/tmp'; $ortam = array('bir_seçenek' => 'aeiou'); $süreç = proc_open('php', $tanıtıcılar, $borular, $dizin, $ortam); if (is_resource($süreç)) { // $borular artık şöyledir: // 0 => alt sürecin std. girdisine yazmak için tanıtıcı // 1 => alt sürecin std. çıktısını okumak için tanıtıcı // Hata çıktıları varsa /tmp/hatalar dosyasına yazılacak fwrite($borular[0], ''); fclose($borular[0]); echo stream_get_contents($borular[1]); fclose($borular[1]); // Bir kısır döngü oluşmaması için proc_close işlevini // çağırmadan önce açık boruların kapatılması hayati önemdedir. $dönen_değer = proc_close($süreç); echo "komut $dönen_değer değerini döndürdü\n"; } ?> ]]> &example.outputs.similar; aeiou [PWD] => /tmp [SHLVL] => 1 [_] => /usr/local/bin/php ) komut 0 değerini döndürdü ]]> - Windows üzerinde <function>proc_open</function> tuhaflığı Aşağıdaki betiğin filename.txt üzerinde search dizgesini arayacağı ve sonucu basacağı umulurken biraz farklı davranır: ]]> &example.outputs; Bu davranışın etrafından dolaşmak için komutu ek tırnaklarla sarmalamak yeterlidir: &reftitle.notes; Windows uyumluluğu 2 (strerr) tanıtıcısı hariç, tanıtıcılar çocuk süreçlere kalıtım yoluyla aktarılırlar, fakat Windows mimarisi dosya tanıtıcılarını düşük seviyeli tanıtıcılarla ilişkilendirmediğinden çocuk süreç bu tanıtıcılara erişemez. stdin, stdout ve stderr beklendiği gibi çalışır. Eğer ihtiyacınız tek yönlü bir boru ise kullanımı daha kolay olan popen işlevini kullanın. &reftitle.seealso; popen exec system passthru stream_select Çalıştırma İşleci