Sử dụng chức năng này để chạy chương trình của bạn trong nền. Nó đa nền tảng và hoàn toàn tùy biến.
<?php
function startBackgroundProcess(
$command,
$stdin = null,
$redirectStdout = null,
$redirectStderr = null,
$cwd = null,
$env = null,
$other_options = null
) {
$descriptorspec = array(
1 => is_string($redirectStdout) ? array('file', $redirectStdout, 'w') : array('pipe', 'w'),
2 => is_string($redirectStderr) ? array('file', $redirectStderr, 'w') : array('pipe', 'w'),
);
if (is_string($stdin)) {
$descriptorspec[0] = array('pipe', 'r');
}
$proc = proc_open($command, $descriptorspec, $pipes, $cwd, $env, $other_options);
if (!is_resource($proc)) {
throw new \Exception("Failed to start background process by command: $command");
}
if (is_string($stdin)) {
fwrite($pipes[0], $stdin);
fclose($pipes[0]);
}
if (!is_string($redirectStdout)) {
fclose($pipes[1]);
}
if (!is_string($redirectStderr)) {
fclose($pipes[2]);
}
return $proc;
}
Lưu ý rằng sau khi lệnh bắt đầu, theo mặc định, hàm này sẽ đóng stdin và stdout của tiến trình đang chạy. Bạn có thể chuyển hướng đầu ra quá trình vào một số tệp thông qua các đối số $ redirectStdout và $ redirectStderr.
Lưu ý cho người dùng windows:
Bạn không thể chuyển hướng stdout / stderr nul
theo cách sau:
startBackgroundProcess('ping yandex.com', null, 'nul', 'nul');
Tuy nhiên, bạn có thể làm điều này:
startBackgroundProcess('ping yandex.com >nul 2>&1');
Ghi chú cho người dùng * nix:
1) Sử dụng lệnh exec shell nếu bạn muốn có được PID thực tế:
$proc = startBackgroundProcess('exec ping yandex.com -c 15', null, '/dev/null', '/dev/null');
print_r(proc_get_status($proc));
2) Sử dụng đối số $ stdin nếu bạn muốn truyền một số dữ liệu vào đầu vào của chương trình:
startBackgroundProcess('cat > input.txt', "Hello world!\n");