【问题标题】:Call to undefined function dl()调用未定义的函数 dl()
【发布时间】:2016-02-04 00:55:17
【问题描述】:

我正在使用 PHTML 编码器对我的 php 文件进行编码,但是当我运行编码文件时它给出错误“调用未定义的函数 dl()”。 请有人帮忙。

<?php
    if(!function_exists("phtmldec")){
        $w=(substr(PHP_OS,0,3)=="WIN")?1:0;$ln="phtmlenc".phpversion();$cd=dirname(__FILE__);

        if($w){
            $ln=$ln.".dll";if($cd[1]==":") $cd=substr($cd,2);
        } else {
            $ln=$ln.".so";if(strlen($cd)<3) $cd=getcwd();
        }

        if(version_compare(phpversion(),"5.2.5")==-1){
            $cd1=ini_get('extension_dir');
            $cd2=PHP_EXTENSION_DIR;

            if($cd[strlen($cd)-1]!="/")$cd=$cd."/";

            if($cd1[strlen($cd1)-1]!="/")$cd1=$cd1."/";

            if($cd2[strlen($cd2)-1]!="/")$cd2=$cd2."/";

            if($cd1[1]==":") $cd1=substr($cd1,2);

            if($cd2[1]==":") $cd2=substr($cd2,2);

            $ic=substr_count($cd,"\\")+substr_count($cd,"/");
            $ic1=substr_count($cd1,"\\")+substr_count($cd1,"/");
            $ic2=substr_count($cd2,"\\")+substr_count($cd2,"/");
            $en=str_repeat("../",max($ic,$ic1,$ic2))."..".$cd.$ln;
        } else {
            $en=$ln;$r=dl($en);if(!$r)exit("Unable to load $en");
        }

        $p="F4\$A016YC2@Y(8Q[Y!2F3[@K2.0>K0Z%5^#2\\,&;5L7\$<KHL)BH<`";
        phtmldec($p);
    }
?>

【问题讨论】:

  • dl 自 5.3 起默认禁用
  • 我刚刚整理了您的代码,并且您在代码末尾缺少一个起始大括号 {(就在最后一个 else 之后)和一个封闭的大括号 }。
  • @aleation 但是仍然出现同样的错误。
  • @k102 那么我如何将 PHTML 编码器用于版本高于 5.3 的 php

标签: php


【解决方案1】:

正如@k102 提到的,dl() 自 5.3 起已默认禁用:

如 php 文档中所述: http://php.net/manual/en/function.dl.php

    5.3.0   dl() is now disabled in some SAPIs due to stability issues.
The only SAPIs that allow dl() are CLI and Embed. Use the Extension Loading Directives instead.

按照那里的建议,改用扩展加载指令: http://www.php.net/manual/en/ini.core.php#ini.extension


基本上你唯一的选择是:

  1. 在 php.ini 上加载配置正确的扩展
  2. 如文档中所述,使用仍支持dl() 的上述 SAPI 之一: (CLI、CGI 和嵌入)
  3. 如果您确实需要动态加载,请降级您的 php 版本

【讨论】:

  • 我使用 'dl(php_curl)' (dinamyc load) 在使用php -f file.php 方法(如前所述的 CLI)时启用 php_curl,并且比编辑原始 php.ini 和创建新的一次 php 更快.ini 然后用-c /path/php.ini 加载它。由于 CLI 将文件名作为 $argv[0] 传递,因此只需使用 if(@!empty($argv)) dl('php_curl'); 检查非 emtpy $argv 即可加载它。
  • 在运行时加载 php 扩展有什么选择吗?例如当您无法控制托管服务器上的 php ini 时?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-30
  • 2015-02-11
  • 2016-11-12
  • 2013-02-14
  • 2013-02-26
相关资源
最近更新 更多