怎么用opendir访问本地根目录以外的目录

上周帮客户做了网站迁移,今天客户风风火火的找到我,说后台无法清除缓存。

我后台进入后一测试,果然如此。因为清除缓存其实就是删除目录里面的缓存文件,于是首先考虑到权限问题

但是是windows2018,不同于Linux权限那么复杂,基本上可以排除了。

于是我打开程序源码,查看信息

因为在网站后台是删除掉WEB和手机站的缓存信息,后台管理也是和WEB、WAP手机站分开的。这里相当于是跨站点删除目录了。

也就是说后台管理站并非删除自身站点里的目录,而是跨站删除。也就是突破了自身根目录。

在一般情况下,是可以直接访问的,除非PHP.ini做了限制

报错:open_basedir()无法opendir外部文件的错。

原因:站点根目录为public, 要访问上一级目录下的文件,需开启外部访问权限

1、检查nginx的配置文件fastcgi.conf 是否设置了open_basedir(一般在最后一行),fastcgi_param PHP_ADMIN_VALUE “open_basedir=$document_root:/tmp/:/proc/” ,其中$document_root是站点根目录,将这整行注释掉,或者改成“open_basedir=$document_root/../:/tmp/:/proc/”

2、php.ini是否设置了open_basedir配置,如果有改成正确配置

3、使用.user.ini文件设置:open_basedir=/home/wwwroot/yestar.whrango.cc:/tmp/:/proc/,注意要使用chattr +i .user.ini 将文件设置为不可修改;一个服务器使用多种php框架建议将1、2关闭,通过.user.ini设置,这样可以针对不同框架的站点进行设置,灵活性更强;如果一个服务器只有一种php框架,可以在fastcgi.conf 或者php.ini里面设置,一劳永逸

开启权限的方式有多种,最好的方式是在站点根目录下(public文件夹下)配置.user.ini文件,将“open_basedir = /home/wwwroot/xxx.com/public:/tmp/:/proc/”改成“open_basedir = /home/wwwroot/xxx.com:/tmp/:/proc/”

使用.user.ini最关键的步骤是:修改完要重启php-fpm,命令:service php-fpm restart

ThinkPHP关闭debug后,显示页面错误的解决办法

解决ThinkPHP项目上传到Linux服务器后,找不到模板的问题

今天将一个项目部署到centOS7.0后,关闭了app_debug.意外发现有些页面居然打不开,具体情况就是:


而我此时的函数方法则是:updatePW()

而寻找模板文件却成了 updatepw.html
为什么会出现这样的情况呢?
我觉得应该是在在函数大小写上面出了问题

根据ThinkPHP3.2.2的手册,需要设置

'URL_CASE_INSENSITIVE'  =>  false,  

在config文件里面添加了上面这一行代码
运行,问题依旧
说明此时还是没有达到效果

我突然想到删除一下Application目录下的Runtime目录试试

删除后发现
果然此时问题解决。模板错误提示也没有了。

这个给我的启示是:windows环境和Linux的环境区别比较大,开发的时候一定要慎重的根据手册来编写规则,一不留神就会进坑里。

所以,生产环境和开发环境,一定还是要多加熟悉!

如何实根据现用户id生成一个唯一邀请码

根据用户id生成与之对应的唯一邀请码,范围为‘0-9A-Z’。这个需求的重点在于加粗的部分,也就是要能够根据邀请码反推出用户ID,这样邀请码就不用入库了,在用户量很大的情况下,性能可以得到不小的提升。

错误思路

随机生成一个字符串,再将用户id拼接到字符串后面,但是这样id就太明显了,容易暴露,而且如果id很长的话,会导致邀请码很长,不利于用户使用。

所以可以将用户id插入到生成的字符串中,隔一个字符插入一个id的数字,这样id混合在字符串中,不容易暴露,但是长度问题并没有得到优化,于是把隔一个字符插入一个id的数字改为隔一个字符插入两个id的数字。然而长度好像并没有受到太大的影响。

邀请码保证了唯一性,并且长度不会太长,用户id也能够根据邀请码反推出来,但是有一点不好的是,别人也可以根据邀请码去反推出user_id,因此,我们需要做一些优化。

正解

function createCode($user_id)

{

    static $source_string = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';

    $num = $user_id;

    $code = '';

    while($num)

    {

        $mod = $num % 36; 

        $num = ($num - $mod) / 36;

        $code = $source_string[$mod].$code;

    }

    return $code;

}

优化

把0剔除,当做补位符号,比如小于四位的邀请码在高位补0,这样36进制就变成了35进制,然后把字符串顺序打乱,这样,在不知道$source_string的情况下,是没办法解出正确的user_id的。

代码如下:

function createCode($user_id) {

    static $source_string = 'E5FCDG3HQA4B1NOPIJ2RSTUV67MWX89KLYZ';

    $num = $user_id;

    $code = '';

    while ( $num > 0) {

        $mod = $num % 35;

        $num = ($num - $mod) / 35;

        $code = $source_string[$mod].$code;

    }

    if(empty($code[3]))

        $code = str_pad($code,4,'0',STR_PAD_LEFT);

    return $code;

}

这样,对应user_id的唯一邀请码就生成了,再附一个解码函数:

function decode($code) {

    static $source_string = 'E5FCDG3HQA4B1NOPIJ2RSTUV67MWX89KLYZ';

    if (strrpos($code, '0') !== false)

        $code = substr($code, strrpos($code, '0')+1);

    $len = strlen($code);

    $code = strrev($code);

    $num = 0;

    for ($i=0; $i < $len; $i++) {

        $num += strpos($source_string, $code[$i]) * pow(35, $i);

    }

    return $num;

}

来源:
https://www.php.cn/php-weizijiaocheng-388405.html