【问题标题】:fpassthru() alternativefpassthru() 替代方案
【发布时间】:2011-05-22 17:32:25
【问题描述】:

我在我的 Wordpress 博客上使用 WP-MINIFY 插件,但由于我的服务器的安全配置,fpassthru() 功能被禁用。所以,我必须找到另一种方法,这样我才能编辑插件。

我在缩小文件时收到此错误:


警告:出于安全原因,fpassthru() 已在 /home/blablabla/public_html/wp-content/plugins/wp-minify/min/lib/Minify 中禁用/Cache/File.php84 行

这是使用 fpassthru 的功能:

/**
 * Send the cached content to output
 *
 * @param string $id cache id (e.g. a filename)
 */
public function display($id)
{
    if ($this->_locking) {
        $fp = fopen($this->_path . '/' . $id, 'rb');
        flock($fp, LOCK_SH);
        fpassthru($fp);
        flock($fp, LOCK_UN);
        fclose($fp);
    } else {
        readfile($this->_path . '/' . $id);            
    }
}

你有什么想法吗?

【问题讨论】:

  • 我很困惑为什么提供商会禁用fpassthru。它只不过是一个文件读取,并且答案显示很容易替换。这很可能被错误地阻止了,而 passthru 本来就是(因为这是一个 exec 命令)。您应该向您的托管服务提供商开一张票。

标签: php wordpress minify


【解决方案1】:
echo stream_get_contents($fp);

(而不是fpassthru 行)做同样的事情,只是消耗更多的内存(并且不如fpassthru 优化)。

【讨论】:

    【解决方案2】:

    你可以使用:

    public function display($id)
    {
        $filename=$this->_path . '/' . $id;
        if ($this->_locking) {
            $fp = fopen($filename, 'rb');
            flock($fp, LOCK_SH);
            //fpassthru($fp);
            $out=fread($fp,filesize($filename));
            echo $out;
            flock($fp, LOCK_UN);
            fclose($fp);
        } else {
            readfile($filename);            
        }
    }
    

    【讨论】:

    • 我与 php 文件处理不相似。我将删除fpassthru() 的行,然后添加此行,而不是fpassthru() 对吗?
    • 查看我的更新答案,包含新功能的完整版本。
    • 谢谢。当我们与@phihag 的答案进行比较时,这种方法更优化?
    • @Eray 不,这将(如果只是非常轻微)慢,因为需要额外的系统调用来确定文件的大小。无论哪种解决方案,在开始任何输出之前,整个文件都将被读取到内存中。此外,如果另一个进程附加到文件而不费心在对filesizefread 的调用之间锁定它,则此版本将失败。 (但这是一个非常牵强的场景)。在这种情况下,您只会读取文件的一部分。
    • @Eray 因为fread($fp, filesize()) 在最好的情况下会明显变慢,在最坏的情况下会慢大约 2* 并且不必要地从上述错误中引入,我会选择stream_get_contents如我的回答所述。
    猜你喜欢
    • 1970-01-01
    • 2012-10-05
    • 2010-09-10
    • 2012-12-05
    • 2013-11-22
    • 2020-11-23
    • 2013-08-07
    • 2015-09-11
    • 2021-06-14
    相关资源
    最近更新 更多