PHP opcache 缓存加密功能

开启opcache扩展后,添加以下的配置
[opcache]
zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.validate_timestamps=0
;opcache.revalidate_freq=60
opcache.file_cache=/www/opcache
opcache.file_cache_only=0
opcache.save_comments=0
opcache.enable_file_override=1

将代码使用opcache_compile_file函数编译好后清空源码文件,这样就起到了隐藏源码的功能。

function opcache_compile_files($dir)
{
    $directory = new RecursiveDirectoryIterator($dir);
    $iterator = new RecursiveIteratorIterator($directory);
    foreach ($iterator as $v)
    {
        if (!$v->isDir() && preg_match('%\.php$%', $v->getRealPath())) {
            opcache_invalidate($v->getRealPath(), true);
            opcache_compile_file($v->getRealPath());
            file_put_contents($v->getRealPath(), '');
        }
    }
}
opcache_compile_files('/www/www.baidu.com');
不足的地方是如果重启服务器或者php-fpm 程序就不能运行了。

搭建Nginx + Vue +PHP的前后端开发过程

1、新建一个vue项目

2、安装axios   npm install axios

3、在main.js文件里添加
import axios from 'axios'
Vue.prototype.axios = axios
4、开发过程中必定是跨域名请求,所以在vue.config.json中
module.exports = {
    devServer: {
        proxy: {
            "/api": {
                target: 'http://www.xxx.com',
                secure: false,
                changeOrigin: true
            }
        }
    }
}
5、然后在nginx配置文件中添加域名
server {
  listen 80;
  server_name www.xxx.com;
  default_type text/html;
  charset utf-8;

  root D:/www/xxx/dist;

  location / {
    index index.html;
    try_files $uri /index.html;
  }

  location /api {
    rewrite ^/(.*) /index.php?$1 last;
  }

  location ~* \.(gif|jpg|jpeg|png|js|css|ico)$
  {
     if (!-f $request_filename) {
         return 404;
     }
  }
 
  location ~ \.php$ {
    internal;
    root D:/www/xxx/public;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
  }
}
6、后面就可以开始愉快的开发啦
this.axios.get('/api/test/data', {params: {id: 110}})
.then(res => {res.data})
.catch(error => {console.log(error)})
7、我用的是Yaf框架,所以在RouterPlugin里
public function routerStartup(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response)
{
    $request_uri = explode('/', ltrim($request->getRequestUri(), '/'), 2);
    if ($request_uri[0] == 'api') {
        $request->setRequestUri('/'.$request_uri[1]);
    }
}

这样就能正确的执行原本的TestController下的dataAction方法啦。

在nginx中x-sendfile解决方案

很多时候网站提供下载文件的时候又需要验证用户的权限,我们可以使用PHP的代码来处理,

$contents = file_get_contents($file);
header("Content-type: application/octet-stream");
header('Content-Disposition: attachment; filename="'. basename($file) .'"');
header("Content-Length: ".filesize($file));
echo $content; // 或者 readfile($file);

但是这个就会导致我们的程序需要将文件内容从磁盘经过一个固定的 buffer 去循环读取到内存,再发送给前端 web 服务器,最后才到达用户。当需要下载的文件很大的时候,这种方式将消耗大量内存,甚至引发 php 进程超时或崩溃。
最好的方式是由php来验证权限后再由NGINX来处理文件传输。

location /protected/ {
 internal;
 root  /some/path;
}
internal 表示只能在内部访问,不能通过浏览器访问

php文件

$filePath= '/protected/iso.img';
header('Content-type: application/octet-stream');
header('Content-Disposition: attachment; filename="'. basename($file) .'"');
//让Xsendfile发送文件
header('X-Accel-Redirect: '.$filePath);

yaf session

$session = Yaf_Session::getInstance();
$session->get('asd'); //获取session值
$session->has('a'); //判断是否存在
$session->set('a', 'asd'); //设置值
$session->count(); //获取session的数量
$session->current(); //当前键值
$session->key(); //当前键名
$session->next(); //下一个session

添加mysqlnd扩展问题

configure: error: Cannot find OpenSSL’s
之前源码编译的时候没有加上mysql扩展
后来去php源码下的ext/mysqlnd 进行编译出现如上错误

网络上的方法也都试过了,都没能解决!

最后解决办法:
到php源码目录进行重新编译

./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --enable-fpm --with-fpm-user=www --with-fpm-group=www --with-pdo-mysql --with-mysqli

添加with-mysqli 会自动添加mysqlnd