zl程序教程

您现在的位置是:首页 >  工具

当前栏目

处理Codeigniter CLI模式无法读取通过Apache写入的文件缓存

Apache文件缓存模式 处理 通过 无法 读取
2023-09-11 14:20:09 时间

运行环境: Ubuntu 16.04 + PHP 5.6.40 + Apache/2.4.18
Codeigniter: 3.1.10


Codeigniter 3.1.10,缓存驱动方式是文件方式

遇到的问题是:通过浏览器访问控制器的方法可以写入缓存文件,当尝试通过CLI模式初始化文件缓存时,无法读取缓存,最终想到的是只能 通过 curl 请求,并判断是内网访问,才能执行这个方法

A PHP Error was encountered

Severity:    Warning
Message:     file_get_contents(/var/www/html/codeigniter3/application/cache/cache_test): failed to open stream: Permission denied
Filename:    /var/www/html/codeigniter3/system/libraries/Cache/drivers/Cache_file.php
Line Number: 275

尝试过给 cache 文件夹的拥有者设置为 Apache的www-data并给了755权限,在 CLI模式下执行,得到的依然是上面的错误

解决方法:

helpers 文件夹中放的 帮助文件,并在application/autoload.php中自动加载这个帮助文件

if(!function_exists('get_real_ip')){
	function get_real_ip(){  
	    $ip=false;  
	    if(!empty($_SERVER["HTTP_CLIENT_IP"])){  
	        $ip = $_SERVER["HTTP_CLIENT_IP"];  
	    }  
	    if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {  
	        $ips = explode (", ", $_SERVER['HTTP_X_FORWARDED_FOR']);  
	    if ($ip) { array_unshift($ips, $ip); $ip = FALSE; }  
	        for ($i = 0; $i < count($ips); $i++) {  
	        if (!preg_match ("^(10|172\.16|192\.168)\.", $ips[$i])) {
	            $ip = $ips[$i];  
	         break;  
	        }  
	    }  
	    }  
	    return ($ip ? $ip : $_SERVER['REMOTE_ADDR']);  
	}	
}

控制器

<?php

/**
* 每天凌晨需要初始化文件緩存
*/
class Init_daily_cache extends CI_Controller {

	public function index(){
	    if(is_cli()){
	        exit('can not Run at cli');
        }
        $ip =  get_real_ip();
        $intranet_ip = array('127.0.0.1','::1');
        //可以先调试在当前服务器的ip,然后再修改$intranet_ip 变量的值
        //echo $ip;exit();
        if(!in_array($ip, $intranet_ip)){
        	exit('不是内网访问,无须的请求');
        }
        //code
        $this->cache->file->save('cache_test', 'test',3600);
	}
}

尝试执行:

vagrant@vagrant:/var/www/html/codeigniter3$ curl http://localhost/codeigniter3/index.php/init_daily_cache
::1