使用php://内存包装器会导致错误

时间:2010-06-07 05:31:51

标签: php wrapper

我正在尝试通过添加一种允许我使用字符串数据而不是文件路径添加附件的方法来扩展来自Worx的PHP邮件程序类。

我想出了类似的东西:

public function addAttachmentString($string, $name='', $encoding = 'base64', $type = 'application/octet-stream')
{
  $path = 'php://memory/' . md5(microtime());
  $file = fopen($path, 'w');
  fwrite($file, $string);
  fclose($file);

  $this->AddAttachment($path, $name, $encoding, $type);
}

但是,我得到的只是一个PHP警告:

PHP Warning:  fopen() [<a href='function.fopen'>function.fopen</a>]: Invalid php:// URL specified

原始文档中没有任何合适的示例,但我在互联网上找到了一对(包括one here on SO),根据它们,我的用法看起来是正确的。

使用此功能是否有任何成功?

我的另一种方法是创建一个临时文件并清理 - 但这意味着必须写入光盘,这个函数将用作大批量进程的一部分,我想避免慢速光盘操作(旧服务器)在可能的情况。这只是一个短文件,但脚本电子邮件的每个人都有不同的信息。

3 个答案:

答案 0 :(得分:16)

只是php://memory。例如,

<?php
    $path = 'php://memory';
    $h = fopen($path, "rw+");
    fwrite($h, "bugabuga");
    fseek($h, 0);
    echo stream_get_contents($h);

产生“bugabuga”。

答案 1 :(得分:1)

快速查看http://php.net/manual/en/wrappers.php.php和源代码,我看不到对“/”。md5(microtime())的支持;“位。

示例代码:

<?php
print "Trying with md5\n";
$path = 'php://memory/' . md5(microtime());
$file = fopen($path, 'w');
if ($file)
{
    fwrite($file, "blah");
    fclose($file);
}
print "done - with md5\n";

print "Trying without md5\n";
$path = 'php://memory';
$file = fopen($path, 'w');
if ($file)
{
    fwrite($file, "blah");
    fclose($file);
}
print "done - no md5\n";

输出:

buzzbee ~$ php test.php 
Trying with md5

Warning: fopen(): Invalid php:// URL specified in test.php on line 4

Warning: fopen(php://memory/d2a0eef34dff2b8cc40bca14a761a8eb): failed to open stream: operation failed in test.php on line 4
done - with md5
Trying without md5
done - no md5

答案 2 :(得分:1)

这里的问题只是is the type and the syntax

  

php://memoryphp://temp读写流,允许将临时数据存储在类似文件的包装中。两者之间的唯一区别是php://memory将始终将其数据存储在内存中,而php://temp将在存储的数据量达到预定义限制(默认值为2 MB)时使用临时文件。此临时文件的位置与sys_get_temp_dir()函数的确定方式相同。

简而言之,您想要的类型是temp,而您想要的语法是:

php://temp/maxmemory:$limit

$limit以字节为单位。您想使用safe byte functions来计算。