PHP中是否有类似于C#的Process.Start的功能?

5
  1. .NET中的Process类包含了多个有用的属性和方法,允许开发者访问进程相关信息。PHP中是否有相应的方法或类?

  2. PHP中是否有类似于C#中"Process.Start()"方法的等效方法?

6个回答

4

以下代码片段应该与“Process.Start()”相同

$executable = '可执行进程'; exec($executable);

有关进程控制和执行的更多信息,请访问http://php.net/manual/en/book.pcntl.php


4

1. 参见程序执行函数

除此之外,PHP标准函数中没有方法/类/属性/命名空间的概念。PHP本质上是一种过程式编程语言,具有少量的面向对象构造和命名空间支持作为新特性添加到最后一个主要版本(5.3)。这也是人们批评它为“玩具”语言的原因之一。您可以随时访问所有PHP内置函数,没有令人讨厌的命名空间妨碍;),只需小心名称冲突即可。

2. @YSJaitawat 回答正确但参考资料有误。

点击此链接访问exec函数文档

注意:如果您从C#迁移到PHP并正在寻找信息,则PHP手册包含出乎意料的好信息,包括用户提交的底部评论,人们通常在其中发布用例或扩展到标准用途。由于手册中可以找到的信息非常丰富,因此PHP可能是最易学的语言。


@DeadMG “我相信很多功能都在当前版本中。” 是的,它们在那里,但它们没有在标准库中使用。要使用“exec”,您不需要键入类似于“process::exec()”这样的内容,因为命名空间和OOP根本不在标准库中使用。基本上,PHP的所有内置函数都存在于主名称空间中。最后一句话足以让很多开发人员感到沮丧,但是要修复它,PHP的开发人员将不得不重新映射所有数千个内置函数。 - Evan Plaice
@DeadMG好吧,刚才的话撤销。我在回答中想要表达的观点是,如果你习惯了C#并且使用PHP,你会感到意外,因为PHP没有像大多数语言那样的'标准库';虽然PHP有面向对象编程(OOP)/命名空间的功能,但它与C#中类/命名空间的严格结构不同。PHP是一种'带有OOP特性的过程式语言',而C#则是一种'从头开始严格面向对象编程(OOP)'的语言。 - Evan Plaice
如果你还没有花足够的时间调试别人的代码,或在一个 400k 行应用程序中追踪大小写错误,那么你就看不出静态类型语言的优势了。我们在 30 年前放弃了 BASIC 而选择使用 C 的原因是有道理的。把 CODE 通过电线传输,我很抱歉。 - 3Dave
@David 哎呀,忘记考虑字节码缓存了。无论如何,我并不是在抨击C#,我喜欢用它编写代码,并且我同意在像你描述的大型应用程序中跟踪错误要容易得多。我只是想说,对于一般的Web开发(小规模),C#和/或静态编译语言都有些过头了。另外值得一提的是,.NET是一个仅限于Windows/Mac平台的平台,而Mono则永远落后于.NET的开发。许多HTTP服务器运行在*nix上,而.NET是一个准开放平台,这可能使PHP成为更有吸引力的选择。 - Evan Plaice
@David 最后一点,说 PHP 没有服务器端缓存只是胡言乱语。当然,在 PHP 中动态生成的内容通常不会自动缓存。但是在 ASP 中也需要额外的步骤才能实现缓存。 - Evan Plaice
显示剩余7条评论

1
Evan Plaice的回答涵盖了一些基础知识,但POSIX系统的大部分内容都与进程管理和通信有关 - 当然,如果您不在Unix/Linux平台上,则所有这些功能都不可用。如果您在使用该平台,请查看manual
但是,它并没有尝试解决由.Net进程类实现的功能 - 这与微软认为程序即GUI的理念密切相关。要处理交互式窗口,您必须查看作为附加组件提供的GTK或MSWindows绑定。

+1 很好的观点。我不会将进程管理的能力仅限于POSIX。在Windows上,.NET也可以做很多类似的事情。问题是,PHP在这方面非常有限。要做比基本的打开/关闭/更改优先级更复杂的操作,您必须执行基本的shell命令并解析sdtin stdout stderr,这可能非常痛苦。它是可行的,但并不容易。 - Evan Plaice

0

如果你是在Windows上运行程序(正如你的帖子所示),你可以使用COM对象(请注意,它在Linux上根本无法工作,但它确实给了你很多无法实现的功能)。

$com = new COM('WScript.Shell');
$com->run('Path/To/Shell/Program', 0, false);

运行命令在这里详细说明


0
在.NET中,Process类包含多个有用的属性/方法,允许开发人员访问进程相关信息。你是否知道PHP中有任何等效的方法或类?
如果您指定您感兴趣的属性/方法,您可能会得到更好的答案。我不是C#开发人员,也不确定这是否符合您的要求,但PHP手册对连接处理的解释如下:
当PHP脚本正常运行时,处于NORMAL状态。如果远程客户端断开连接,则会打开ABORTED状态标志。远程客户端断开通常是由用户点击停止按钮引起的。如果达到了PHP强制执行的时间限制(请参阅set_time_limit()),则会打开TIMEOUT状态标志。
您可以使用connection_status()检查连接状态。
switch (connection_status())
{
    case CONNECTION_NORMAL:
        // ...
    break;

    case CONNECTION_ABORTED:
        // ...
    break;

    case CONNECTION_TIMEOUT:
        // ...
    break;
}

POSIX函数(仅在POSIX系统下可用)提供了一些额外的信息。此外,一些杂项函数,特别是sys_getloadavg()和睡眠函数,可以根据您的需求进行使用。

PHP中是否有类似C#方法“Process.Start()”的等效方法。

有几个程序执行函数,具体如下:

在Windows下,您还可以使用COM类打开命令提示符:

$cmd = new COM('WScript.Shell');

另外,如果你希望免受代码注入攻击,请不要忘记使用 escapeshellarg()escapeshellcmd() 对任何用户提供的输入进行转义。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接