PHP dış kabuk betiği çağırmak ve ona bazı girdi göndermek

2 Cevap php

Amacım bir PHP programından bir kabuk çağırmak ve daha sonra bazı sonlandırma tuşuna (I sonlandırma aşamasının doğru yürütülmesini test etmek istiyorum çünkü ben sadece onu öldürmek değil) göndermek için birkaç saniye bekleyin.

İşte ben olmasını istiyorum ne bir örnek:

system( "RUNMYSCRIPT.sh" );  // Launch the script and return immediately.
sleep( 10 );                 // Wait.
exec( "q" );                 // Send a termination key to the previous script?

2 Cevap

Sen proc_open() senin süreci ile iletişim kurabilmek için kullanmanız gerekir. Sizin örnek şöyle çalışacak:

// How to connect to the process
$descriptors = array(
   0 => array("pipe", "r"),
   1 => array("pipe", "w")
);

// Create connection
$process = proc_open("RUNMYSCRIPT.sh", $descriptors, $pipes);
if (!is_resource($process)) {
    die ('Could not execute RUNMYSCRIPT');
}

// Sleep & send something to it:
sleep(10);
fwrite($pipes[0], 'q');

// You can read the output through the handle $pipes[1].
// Reading 1 byte looks like this:
$result = fread($pipes[1], 1);

// Close the connection to the process
// This most likely causes the process to stop, depending on its signal handlers
proc_close($process);

Sen sadece bu tür bir dış uygulamaya bir anahtar olay gönderemezsiniz. It) proc_open() yerine sisteminin (kullanarak bir dış kabuk ve stdin yazmak mümkün, ama çoğu kabuk betikleri yerine stdin izlerken doğrudan tuş girişlerini dinleyebilirsiniz.

Ne yerine yapabilirsiniz sinyallerini kullanmaktır. Hemen hemen tüm kabuk uygulamaları SIGTERM ve SIGHUP gibi sinyallere yanıt. Bu tuzak mümkündür ve kabuk komut kullanarak yanı sıra bu sinyalleri işleyebilir. Eğer kabuk komut dosyasını başlatmak için proc_open () kullanıyorsanız o zaman proc_terminate() bir SIGTERM sinyali göndermek için kullanabilirsiniz.