PHP | popen 函數

怎樣打開進程文件指針

最近更新時間 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);
rss_feed