【问题标题】:Equivalent of /dev/null for writing garbage test data?相当于 /dev/null 用于写入垃圾测试数据?
【发布时间】:2013-08-04 21:03:05
【问题描述】:

我需要执行一系列测试,以便为我设计的一组函数选择最快的代码分支。由于此函数输出一些文本/HTML 内容,我想测量速度而不用垃圾数据填充浏览器。

在 PHP 中是否有与 /dev/null 等价的东西?我发现与写入临时数据最接近的等价物是php://tempphp://memory,但这两个 I/O 流存储垃圾数据,我希望每条数据都以“假”方式写入。

我总是可以将所有垃圾数据写入变量 ala $tmp .= <function return value goes here>,但我确信必须有更优雅或更好的方法来完成此操作无需诉诸 shell_exec() 之类的函数, exec(), proc_open() 和类似的方法(我要测试最终代码的生产服务器不会有任何这些命令)。

有没有等价物?

【问题讨论】:

  • 使用ob_start()ob_end_clean()包围代码的输出缓冲
  • 如果你不想输出,就不要输出任何东西!
  • 如果您似乎想要一个文件资源用于输出,为什么使用/dev/null 不可行。你的代码是怎么输出的?
  • @Dagon 这不是重点。我需要测试输出速度(以及其他因素),所以我必须输出函数返回值。只是......我想在不(理想情况下)填充任何缓冲区的情况下做到这一点(我的测试循环通常迭代 10K 标记并平均在 1M 标记上运行,所以填充那么多数据不是一个选项......不是一个理智一个,至少):P
  • 然后回到不需要输出,你在这里循环

标签: php garbage dev-null


【解决方案1】:

// 对于它的价值,这适用于 CentOS 6.5 php 5.3.3。

$fname = "/dev/null";
if(file_exists($fname))   print "*** /dev/null exists ***\n";

if (is_readable($fname))  print "*** /dev/null readable ***\n";

if (is_writable($fname))  print "*** /dev/null writable ***\n";

if (($fileDesc = fopen($fname, "r"))==TRUE){
    print "*** I opened /dev/null for reading ***\n";
    $x = fgetc($fileDesc);
    fclose($fileDesc);
}

if (($fileDesc = fopen($fname, "w"))==TRUE)
{
    print "*** I opened /dev/null for writing ***\n";
    $x = fwrite($fileDesc,'X');
    fclose($fileDesc);
}
if (($fileDesc = fopen($fname, "w+"))==TRUE) {
    print "*** I opened /dev/null for append ***\n";
    $x = fwrite($fileDesc,'X');
    fclose($fileDesc);
}

【讨论】:

    【解决方案2】:

    我认为你最好的选择是streamWrapper,它可以用微时间描述你在写入时的输出,然后你可以stream_wrapper_register。说明书里的example就不错了。

    如果你的代码不是那么复杂或者你摔倒了这将是矫枉过正,你可以使用ob_start回调处理程序

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2014-08-05
      • 2011-09-21
      • 2018-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多