PHP中如何运用ini_set和ini_get()

本文为转载


在PHP配置函数中,有一种函数的功能是实现设置php.ini中的某些变量值的。它就是我们今天要为大家介绍的PHP ini_set函数。

  PHP ini_set函数是设置选项中的值,在执行函数后生效,脚本结束的时候,这个设置也失效。不是所有的选项都能被改函数设置的。具体那些值能够设置,可以查看手册中的列表。

  就是能够设置php.ini中的选项值比如,display_error选项关闭了,但是你要显示程序中的错误信息,方便你调试程序,那么就可以使用PHP ini_set函数:

  ini_set(”display_errors”, “On”);

  那么在你这个页面的程序都会显示错误信息了,而且你还可以使用error_reporting来设置显示的错误信息级别。

  如果你需要增加脚本执行时间,那么可以设置:

  ini_set(”max_execution_time”, “180″);

  那么脚本执行时间就由默认的30秒变为180秒,当然,你也可以使用set_time_limit()来设置。

  其实你把PHP ini_set函数和ini_get结合使的话,非常好。比如你想在配置文件里添加自己的包含文件路径,但是你有没有权限更改php.ini,那么你可以结合两个函数:

  ini_set(’include_path’,ini_get(’include_path’).’:/your_include_dir:’);



      PHP中的函数作用功能各不相同,灵活的使用这些函数,才能将这门语言发挥出极大的作用。PHP配置函数ini_get()相信很多人都使过,就是获取配置文件中某一个选项的值,如果是true值就返回1,如果是false值就返回0,字符串就返回字符串。

  比如手册中的例子:

< ?php

/* Our php.ini contains the following settings:

display_errors = On

register_globals = Off

post_max_size = 8M

*/

echo ‘display_errors = ‘ . ini_get(’display_errors’) . “ ”; //显示错误是否打开

echo ‘register_globals = ‘ . ini_get(’register_globals’) . “ ”;//全局变量是否打开

echo ‘post_max_size = ‘ . ini_get(’post_max_size’) . “ ”;//最多能提交的文件大小

echo ‘post_max_size+1 = ‘ . (ini_get(’post_max_size’)+1) . “ ”;

?>

  输出:

  display_errors = 1

  register_globals = 0

  post_max_size = 8M

  post_max_size+1 = 9

 

  PHP配置函数ini_get()主要是为了获取配置文件,可以方便你很多操作。比如你想操作字符串过滤,但是又不清楚magic_quotes_gpc有没有打开,所以你就可以这样写一个函数:

 

  /* 字符串过滤函数 */

function stringFilter($str)

{

     if (ini_get(’magic_quotes_gpc)’)

    {

       return $str;

    } else

     {

       return addslashes($str);

}

}

  当然,如果你无法知道你的全局变量是否打开,也可以定制这样的函数:

  /* 变量检测函数 */

      function getGetVar($var)

     {

       if (ini_set(’register_gobals’))

      { 

          return $var;

       } else {

          return $_GET['var'];

       }

     }

  当然,你可以用PHP配置函数ini_get()做很多用途,自己慢慢体会。

 
<think>我们正在解决的是:使用PHPExcel时ini_set函数没有效果的解决方案。 根据引用[4]中提到,在程序中设置ini_set('max_execution_time',0)可以修改最大执行时间,但用户反馈ini_set没有效果。 可能的原因及解决方案: 1. 安全模式(safe_mode)限制:在安全模式下,ini_set可能被禁用。但注意,PHP5.4以后安全模式已被移除。如果环境是较新的PHP版本,则不是这个问题。 2. 权限不足:某些ini设置(如memory_limit)可能被设置为PHP_INI_SYSTEM,只能在php.ini或httpd.conf中修改,无法通过ini_set修改。 3. 设置时机:ini_set必须在PHPExcel消耗大量资源之前调用。 4. 配置被覆盖:框架或CMS可能有自己的配置机制,覆盖了ini_set的设置。 5. 函数被禁用:在php.ini中禁用了ini_set函数(通过disable_functions)。 解决方案: 1. 检查ini_set是否被禁用:使用phpinfo()查看disable_functions列表。 2. 尝试在更早的位置调用ini_set(例如在入口文件或控制器最开始部分)。 3. 如果ini_set无效,则考虑直接修改php.ini或使用.htaccess(对于Apache)或用户.ini(对于PHP>=5.3)进行设置。 4. 使用其他方式绕过,例如分块处理数据减少内存占用执行时间。 具体步骤: 步骤1:检查disable_functions 在代码中输出phpinfo(),查看disable_functions中是否包含ini_set。 步骤2:确认设置位置 将ini_set放在脚本的最开始,确保在加载任何大型库或数据之前。 步骤3:使用.htaccess或用户.ini(如果允许) 对于Apache服务器,在项目根目录的.htaccess文件中添加: php_value memory_limit 512M php_value max_execution_time 300 对于Nginx服务器,不支持.htaccess,需要修改服务器配置或使用php-fpm的配置(例如在pool.d目录下的www.conf中设置php_admin_value)。 步骤4:分块处理数据 如果无法修改配置,则优化代码,减少内存占用。例如分批查询数据并写入Excel,及时释放内存。 步骤5:使用PHPExcel的缓存机制 参考之前的优化,设置PHPExcel使用磁盘缓存。 步骤6:尝试设置其他内存限制函数 如果ini_set('memory_limit')无效,可以尝试使用`ini_set('memory_limit', '-1')`或者使用shell命令(如果允许)启动一个新的进程。 但注意:在共享主机上可能没有权限修改php.ini或.htaccess,这种情况下只能通过优化代码来解决。 代码优化示例: 在ThinkPHP5中,可以尝试在控制器的初始化方法中设置ini_set,确保最早执行。 同时,参考引用[1]中提到的,如果遇到open_basedir问题,需要修改PHPExcel的文件处理方式。但这里我们主要解决ini_set无效的问题。 如果以上都无法解决,最后的办法是联系主机提供商,请求修改php.ini配置。 生成相关问题: 相关问题: 1. 在共享主机环境中如何解决PHPExcel导出大文件的内存限制问题? 2. 如何使用PHPExcel的磁盘缓存功能来减少内存占用? 3. 除了ini_set,还有哪些方法可以临时提高PHP脚本的内存限制? 4. 如何检测当前PHP环境的disable_functions设置? 5. 在ThinkPHP5框架中,哪个位置是最早可以设置ini_set的地方? 注意:回答中引用的段落末尾自然地添加引用标识。 </think>以下是针对 PHPExcel 中 `ini_set()` 函数无效问题的完整解决方案,结合系统权限、代码配置替代方案三个维度: --- ### 一、系统权限问题(最常见原因) #### 1. 检查 `disable_functions` 限制 在 PHP 文件中添加以下代码检测禁用函数列表: ```php <?php phpinfo(); // 搜索 "disable_functions" 项是否包含 "ini_set" ``` 如果 `ini_set` 被禁用,需联系服务器管理员移除限制或改用其他方案[^1]。 #### 2. 绕过 `open_basedir` 限制 修改 PHPExcel 文件处理类(**万网等虚拟主机适用**): ```diff // 文件:Classes/PHPExcel/Shared/File.php - $openBaseDir = ini_get('open_basedir'); + $openBaseDir = ''; // 强制清空限制 if ($openBaseDir) { // ...原有代码 } ``` --- ### 二、代码层解决方案 #### 1. 优先使用框架配置(ThinkPHP5) 在应用配置文件 `config.php` 中设置: ```php return [ 'memory_limit' => '1024M', // 内存限制 'max_execution_time' => 600, // 超时时间(秒) ]; ``` #### 2. 强制 CLI 模式执行(绕过 web 限制) 创建命令行任务导出: ```bash # 创建命令 php think make:command ExportExcel ``` ```php // 文件:application/command/ExportExcel.php protected function configure(){ $this->setName('export')->setDescription('Excel导出'); } protected function execute(Input $input, Output $output){ ini_set('memory_limit', '1024M'); // CLI模式通常无限制 // PHPExcel导出代码... } ``` 执行命令:`php think export` --- ### 三、替代优化方案 #### 1. 使用 `set_time_limit()` 替代 ```php // 优先放在脚本最顶部 set_time_limit(600); // 单位:秒 // 内存设置改用分段处理 $chunkSize = 500; // 分块处理数据 foreach(array_chunk($data, $chunkSize) as $chunk) { // 逐块写入PHPExcel } ``` #### 2. CSV 替代方案(绕过 PHPExcel 限制) ```php header('Content-Type: text/csv'); $fp = fopen('php://output', 'w'); // 逐行写入(内存占用<10MB) while ($row = fetchFromDatabase()) { fputcsv($fp, $row); // 每1000行刷新缓冲区 if(0 === ($lineCount % 1000)) ob_flush(); } fclose($fp); ``` #### 3. 队列异步导出 ```php // 使用Redis队列 Queue::push(function ($job) { set_time_limit(0); // 队列任务无时间限制 $excel = new PHPExcel(); // ...生成文件 $job->delete(); }); ``` --- ### ️ 关键注意事项 1. **权限优先级链** `服务器配置 > php.ini > .htaccess > ini_set()` 当 `ini_set()` 失效时,必须向上层配置查找原因[^4] 2. **虚拟主机特殊限制** ```mermaid graph LR A[共享主机] --> B[禁用ini_set] A --> C[限制open_basedir] A --> D[内存限制<256M] ``` 3. **终极解决方案公式** $$ \text{解决方案} = \begin{cases} \text{CSV导出} & \text{若数据量}>10\text{万行} \\ \text{命令行导出} & \text{若需完整Excel格式} \\ \text{队列任务} & \text{超大数据集} \end{cases} $$ ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值