Trong Java và Python, bạn có các mô-đun ProcessBuilder
hoặc subprocess cho phép bạn dễ dàng bắt đầu quá trình bằng cách sử dụng các chuỗi chưa thoát, ví dụ: ["ls", "some unescaped directory name"]
- chúng cũng cung cấp cho bạn các công cụ mạnh mẽ như truy cập để đọc từ stdout, stderr. Có tính năng tương đương nào của PHP thông minh hơn và hữu ích hơn chỉ là exec()
không?Bất kỳ tương đương với tiến trình con trong PHP?
7
A
Trả lời
4
Tương đương gần nhất cung cấp cho bạn quyền truy cập vào stdin
, stdout
và stderr
, với giao tiếp hai chiều, sẽ là proc_open()
.
Dưới đây là các ví dụ từ các tài liệu:
<?php
$descriptorspec = array(
0 => array("pipe", "r"), // stdin is a pipe that the child will read from
1 => array("pipe", "w"), // stdout is a pipe that the child will write to
2 => array("file", "/tmp/error-output.txt", "a") // stderr is a file to write to
);
$cwd = '/tmp';
$env = array('some_option' => 'aeiou');
$process = proc_open('php', $descriptorspec, $pipes, $cwd, $env);
if (is_resource($process)) {
// $pipes now looks like this:
// 0 => writeable handle connected to child stdin
// 1 => readable handle connected to child stdout
// Any error output will be appended to /tmp/error-output.txt
fwrite($pipes[0], '<?php print_r($_ENV); ?>');
fclose($pipes[0]);
echo stream_get_contents($pipes[1]);
fclose($pipes[1]);
// It is important that you close any pipes before calling
// proc_close in order to avoid a deadlock
$return_value = proc_close($process);
echo "command returned $return_value\n";
}
?>
Nếu bạn chỉ cần stdout
và stdin
, bạn có thể sử dụng popen()
.
Đây là ví dụ sửa đổi của tôi, từ những tay hút:
<?php
$handle = popen('/path/to/executable', 'r');
$lines = [];
while (!feof($handle))
{
$lines[] = fgets($handle);
}
pclose($handle);
này sẽ đọc đầu ra của /path/to/executable
vào một loạt các dòng sản lượng.
Bạn cũng đã hỏi về các đối số thoát. Bạn có thể làm điều đó với escapeshellarg()
:
$escapedArg = escapeshellarg($arg);
Các vấn đề liên quan
- 1. SQL Server: bất kỳ tương đương strpos()?
- 2. Bất kỳ giá trị nào tương đương với. = Để thêm vào đầu chuỗi trong PHP?
- 3. Có bất kỳ IIS tương đương với Tomcat không?
- 4. Java tương đương với python tất cả và bất kỳ
- 5. Có bất kỳ Java tương đương với hàm http_build_query của PHP không?
- 6. Tương đương với ASP.NET HttpModules trong PHP
- 7. Python có bất kỳ vòng lặp tương đương (không foreach)
- 8. Javascript tương đương với urldecode của php()
- 9. Tương đương với mysql_list_tables trong PHP PDO?
- 10. Perl tương đương với get_file_contents của PHP()?
- 11. JSON - có bất kỳ tương đương CDATA XML nào không?
- 12. Perl tương đương với escapeshellarg của PHP
- 13. Java tương đương với preg_replace_callback của PHP
- 14. Đi tương đương với một con trỏ void trong C
- 15. JavaScript tương đương với PHP preg_replace
- 16. PHP - Tương đương với Python PDB (Debugger) trong PHP?
- 17. Tương đương với con trỏ 'này'
- 18. Python tương đương với memory_get_usage() của PHP?
- 19. Java tương đương với php chết
- 20. PHP tương đương với PyQuery hoặc Nokogiri?
- 21. Javascript tương đương với strtotime của php()?
- 22. Ruby tương đương với $ của PHP $
- 23. Danh sách PHP() tương đương với Python
- 24. Tương đương HashSet của Java trong PHP
- 25. Perl tương đương với preg_callback của PHP
- 26. PHP tương đương với biểu tượng Ruby
- 27. PHP tương đương với Python __name__ == "__main__"?
- 28. php function array_keys tương đương trong jquery
- 29. Đi tương đương với 'implode' của PHP
- 30. php tương tác shell không có bất kỳ đầu ra?
Thực ra PHP không được thực hiện để chạy quy trình. –
Thật sao? Đó là những gì tôi nghĩ, mặc dù trong * PHP hiện đại * họ nói bạn có thể sử dụng PHP như một ngôn ngữ kịch bản như Bash - "PHP cũng có thể được sử dụng để xây dựng các ứng dụng dòng lệnh mạnh mẽ (giống như bash, Ruby, Python, vv) Nhiều nhà phát triển PHP không nhận ra điều này và bỏ lỡ một tính năng thực sự thú vị. " - http://shop.oreilly.com/product/0636920033868.do – NoBugs
không chắc chắn nếu [popen] (http://php.net/manual/en/function.popen.php) hữu ích cho bạn. – Jigar