【问题标题】:Is there an equivalent to C#’s Process.Start in PHP?PHP 中是否有与 C# 的 Process.Start 等价的功能?
【发布时间】:2011-02-28 02:05:05
【问题描述】:
  1. 在 .NET 中 Process 类包含几个有用的属性/方法,允许开发人员访问进程相关信息。 PHP中有没有等价的方法或类?

  2. PHP中有没有类似C#方法“Process.Start()”的等效方法?

【问题讨论】:

    标签: c# php .net process methods


    【解决方案1】:

    Evan Plaice 的回答涵盖了一些基础知识,但是 POSIX 系统的很大一部分都是关于管理进程和通信的 - 当然,您不在 Unix/Linux 平台上,那么所有这些功能都不可用。如果是,请查看manual

    但是,它并没有尝试解决 .Net 进程类实现的功能 - 这与 Microsoft 认为程序是 GUI 的想法密切相关。要使用交互式窗口,您必须查看 GTK 或 MSWindows 绑定作为螺栓连接。

    【讨论】:

    • +1 好点。我不会将流程管理的功能仅限于 POSIX。在 Windows 上的 .NET 中,您也可以按照这些方式进行大量工作。问题是,PHP 在这方面非常有限。要执行比基本打开/关闭/更改优先级更复杂的操作,您必须执行基本的 shell 命令并解析 sdtin stdout stderr,这可能会非常痛苦。这是可行的,只是不容易。
    【解决方案2】:

    1.Program execution Functions

    除了 PHP 标准函数中没有方法/类/属性/命名空间的概念。 PHP 本质上是一种过程编程语言,在上一个主要版本 (5.3) 中添加了少量 OOP 结构和命名空间支持作为 功能。这也是人们批评它为“玩具”语言的原因之一。您可以随时访问所有 PHP 内置函数,没有讨厌的命名空间妨碍 ;),只是要小心名称冲突。

    2.@YSJaitawat 正确答案错误参考。

    点击此链接查看exec function documentation in the PHP manual

    注意:另外,如果您正在从 C# 迁移到 PHP 并寻找信息,PHP manual 有一些令人惊讶的好信息,包括在人们通常发布用例的条目底部的用户提交的 cmets或标准用途的扩展。由于手册中有大量信息,这可能是最容易学习的语言。

    【讨论】:

    • 我相信其中很多都在当前版本中。 5.3 中的命名空间,我在代码中使用了构造函数。
    • @DeadMG 更新了答案的准确性并使其更加“面向未来”。当我说“构造”时,我指的不是“构造器”。通过说 PHP 几乎没有“结构”,我只是在说明 OOP 存在,但它并没有像 Java/C#/Python 程序员所期望的那样具有完整的功能。与大多数声称支持 OOP 的语言相比,PHP 中的 OOP 非常少。
    • @DeadMG “我相信其中很多都在当前版本中”是的,它们在那里,但它们没有在标准库中使用。要使用 'exec',您不需要键入类似 'process::exec()' 的内容,因为标准库中根本不使用名称空间和 OOP。本质上,PHP 的所有内置函数都位于主命名空间中。最后一句话足以让许多开发人员畏缩,但要修复它,PHP 的开发人员将不得不重新映射所有数千个内置函数。
    • 我的意思也不是字面意义上的构造作为构造函数(我也没有想到),我的意思是我使用了在对象中包含构造函数的构造。
    • @DeadMG 好的,从头开始。我试图在回答中说明的一点是。如果您习惯于 C# 并且使用 PHP,那么您会大吃一惊,因为 PHP 不像大多数语言那样具有“标准库”的外观;和 OOP/命名空间在那里,但与它们在 C# 中存在的类/命名空间的严格结构中的方式不同。 PHP 是一种“具有 OOP 特性的过程语言”,而 C# 是一种“从头开始严格的 OOP”。
    【解决方案3】:

    在 .NET 中,Process 类包含几个有用的属性/方法,它们 允许开发人员访问进程 相关信息。你有没有 PHP 中的等效方法或类。

    如果您指定了您感兴趣的属性/方法,您可能会得到更多/更好的答案。我不是 C# 开发人员,我也不确定这是否是您所追求的,但 what the PHP Manual has to say about connection handling 是这样的:

    当 PHP 脚本正常运行时 NORMAL 状态,处于活动状态。如果 远程客户端断开ABORTED 状态标志打开。一个遥控器 客户端断开连接通常是由 用户点击他的 STOP 按钮。如果 PHP 强加的时间限制(见 set_time_limit()) 被击中,TIMEOUT 状态标志已打开。

    您可以通过...查看连接状态...connection_status():

    switch (connection_status())
    {
        case CONNECTION_NORMAL:
            // ...
        break;
    
        case CONNECTION_ABORTED:
            // ...
        break;
    
        case CONNECTION_TIMEOUT:
            // ...
        break;
    }
    

    POSIX functions(仅在 POSIX 系统下可用)提供了一些附加信息。此外,一些miscellaneous functions,特别是sys_getloadavg() 和睡眠功能可能很有用,具体取决于您要查找的内容。

    在 PHP 中有任何等效的方法,例如 C# 方法“Process.Start()”。

    有几个Program Execution functions,具体是:

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

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

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

    【讨论】:

      【解决方案4】:

      如果(正如您的帖子所暗示的那样)您在 Windows 上运行,您可以使用 COM 对象(请注意,它在 Linux 上根本不起作用,但它确实为您提供了很多没有它就无法实现的东西) .

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

      运行命令是detailed here

      【讨论】:

        【解决方案5】:

        如果你想访问你创建的进程的标准输入和标准输出,你可以使用:

        http://be.php.net/manual/en/function.proc-open.php

        【讨论】:

          【解决方案6】:

          下面的代码 sn-p 应该和“Process.Start()”做同样的事情

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

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

          【讨论】:

            猜你喜欢
            • 2011-12-02
            • 2011-11-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-03-21
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多