PHP | popen 函数

Lasted 2021-01-19 16:37:24

popen 函数打开进程文件指针。

打开一个指向进程的管道,该进程由派生给定的 command 命令执行而产生。

函数定义

popen ( string $command , string $mode ) : resource
// 源文件位于:ext/standard/file.c
# 函数定义

PHP_FUNCTION(popen)
{
  ...
  posix_mode = estrndup(mode, mode_len);
#ifndef PHP_WIN32
  {
    char *z = memchr(posix_mode, 'b', mode_len);
    if (z) {
      memmove(z, z + 1, mode_len - (z - posix_mode));
      mode_len--;
    }
  }
#endif

  /* Musl only partially validates the mode. Manually check it to ensure consistent behavior. */
  if (mode_len > 2 ||
    (mode_len == 1 && (*posix_mode != 'r' && *posix_mode != 'w')) ||
    (mode_len == 2 && (memcmp(posix_mode, "rb", 2) && memcmp(posix_mode, "wb", 2)))
  ) {
    zend_argument_value_error(2, "must be one of \"r\", \"rb\", \"w\", or \"wb\"");
    efree(posix_mode);
    RETURN_THROWS();
  }

  fp = VCWD_POPEN(command, posix_mode);
  if (!fp) {
    php_error_docref2(NULL, command, posix_mode, E_WARNING, "%s", strerror(errno));
    efree(posix_mode);
    RETURN_FALSE;
  }

  stream = php_stream_fopen_from_pipe(fp, mode);

  if (stream == NULL) {
    php_error_docref2(NULL, command, mode, E_WARNING, "%s", strerror(errno));
    RETVAL_FALSE;
  } else {
    php_stream_to_zval(stream, return_value);
  }

  efree(posix_mode);
}

参数

  • checkcommand - 命令。
  • checkmode - 模式。

返回值

  • checkint - 返回一个和 fopen() 所返回的相同的文件指针,只不过它是单向的(只能用于读或写)并且必须用 pclose() 来关闭。发生错误时会返回 false。

示例1: - 使用 popen() 函数打开进程文件指针。

<?php
/**
 * PHP popen() 函数打开进程文件指针。
 *
 * @since Version 1.0.0
 * @filesource
 */

// 创建进程
$handle = popen('/bin/ls', 'r');

// 关闭进程指针
pclose($handle);