ini_set用法

本文介绍了 PHP 中的 ini_set 函数,展示了如何通过该函数动态地改变 PHP 的配置选项,如 max_execution_time 和 display_errors 等。适用于在运行时需要临时调整 PHP 设置的情况。

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:’);

 

 

/ ini_set更改php.ini配置功能


利用ini_set可以快速的修改php.ini配置设置哦,无需打开php.ini就可以了,特别是虚拟主机时你没有修改php.ini的权限时就会发现这个函数的作用了,下面看几个实例吧。
*/
//ini_set具有更改php.ini设置的功能。此函数接收两个参数:需要调整的配置变量名,以及变量的新值。

//例如,在某脚本出现时增加最大执行时间(maximum execution time):

 $old_max_execution_time = ini_set('max_execution_time', 120);
   echo "old timeout is $old_max_execution_time <br />";

   $max_execution_time = ini_get('max_execution_time');
   echo "new timeout is $max_execution_time <br />";
   
   echo 'function sets supported in this install are:<br />';
  $extensions = get_loaded_extensions();
  foreach ($extensions as $each_ext)
  {
    echo "$each_ext <br />";
    echo '<ul>';
    $ext_funcs = get_extension_funcs($each_ext);
    foreach($ext_funcs as $func)
    {
       echo "<li> $func </li>";
    } 
    echo '</ul>';
  }
?>

<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} $$ ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值