代码如下:

ob_start();
readfile($url);
$img=ob_get_contents();
ob_end_clean();
$fp2=@fopen($path,'a');
fwrite($fp2,$img);
fclose($fp2);

就是从url下载图片然后存到磁盘。本地测试正常,上传到服务器就不行了。根本没有写入文件。
把以上代码单独放到一个文件中,提示:

"Warning: fwrite() expects parameter 1 to be resource, boolean give

fwrite函数第一个参数应该是fopen()创建的文件指针,但是接受到了布尔值"。

说明fopen返回了false。打开文件流失败。
怀疑是目录权限问题。把目录所有者设置为www,权限设置为777,仍然返回false。
搜索后发现原来是@符号把fopen的错误屏蔽了。实际上系统提示了:

"fopen(): open_basedir restriction in effect.
File(/home/wwwroot/aa/bb/cc/4292-set.txt) is not within the allowed
path(s): (/home/wwwroot/default:/tmp/:/proc/) in
/home/wwwroot/xx/yy/f.php on line 23

由于open_basedir的限制,文件(/home/wwwroot/aa/bb/cc/4292-set.txt)不在允许的目录内,所以不能打开。允许的进行文件操作的目录为(/home/wwwroot/default:/tmp/:/proc/)"。

只要将要写入的目录添加到php.ini的open_basedir即可,当然原有的值也要添加,用冒号隔开,否则会出现无法写入session而导致的“session_start(): Failed to initialize storage module: files (path: )”错误。

最近发现一个前端框架Semantic UI。感觉很好用。但是中文教程不多,官网文档比较慢。所以想要个文档放在本地查看。
生成文档的方法有点复杂,官网也说得不清不楚,在10号issue里面找到了详细的方法:

  1. 先创建一个目录,随便起个名,里面再创建两个目录ui,docs。
  2. 下载https://github.com/Semantic-Org/Semantic-UI-Docs放到docs目录;
  3. 下载https://github.com/Semantic-Org/Semantic-UI放到ui目录.
  4. 分别进入docs目录和ui目录运行npm install
  5. 进入ui目录运行gulp build-docs(如果提示没有gulp就安装它npm install gulp)
  6. 进入doc目录运行docpad run(如果提示没有docpad就安装它npm install docpad)
  7. 然后打开浏览器进入http://localhost:9778/应该就可以了
  8. 然而,进去会发现页面错乱,缺少各种样式文件。把ui文件夹下面的theme和components目录复制到doc 9. 文件夹下面的out文件夹里面。再刷新浏览器,文档界面就和官网一致了。
  9. docs/out里面的文件就可以放到静态空间进行托管了。

不过现在科技发达,直接给官网做了cdn加速。

网上很多教程都是说,将http.conf里面的Require local改成Require all granted。然而试了一万次并没有用。
WAMPServer 3.0.6版本中需要修改Apache的httpd-vhosts.conf,将VirtualHost里面的Require local改成Require all granted。再次重启服务器即可外部访问。

<VirtualHost *:80>
    ServerName localhost
    DocumentRoot d:/wamp64/www
    <Directory  "d:/wamp64/www/">
        Options +Indexes +Includes +FollowSymLinks +MultiViews
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

原版的分页代码中的类名是写死了的,换个前端框架就不能匹配了。
想了半天,自己写了生成Semantic UI分页代码的函数。
可以根据总页码适应,使当前最多出现10个页码,而不是总共有多少页就出现多少页码。

function semanticPage($totalPage,$currPage,$urlFuncParam){
    // 参数为总页数,当前页码,U方法生成url使用的参数,比如说"Admin/Index/Article?p="
    $html="<div class='ui right floated pagination menu'>";
    if($currPage!=1){
        $html.='<a href="'.U($urlFuncParam.($currPage-1)).'" class="icon item"><i class="left chevron icon"></i></a>';
    }
    if($totalPage<10){
        for($i=1;$i<$totalPage;$i++){
            if($i==$currPage){
                $html.='<a href="'.U($urlFuncParam.$i).'" class="item active">'.$i.'</a>';
            }else{
                $html.='<a href="'.U($urlFuncParam.$i).'" class="item">'.$i.'</a>';
            }
             
        }
    }else{
        if($currPage<5){
            for($i=1;$i<=10;$i++){
                if($i==$currPage){
                    $html.='<a href="'.U($urlFuncParam.$i).'" class="item active">'.$i.'</a>';
                }else{
                    $html.='<a href="'.U($urlFuncParam.$i).'" class="item">'.$i.'</a>';
                }
            }
        }else if($totalPage-$currPage<5){
            for($i=$totalPage-9;$i<=$totalPage;$i++){
                if($i==$currPage){
                    $html.='<a href="'.U($urlFuncParam.$i).'" class="item active">'.$i.'</a>';
                }else{
                    $html.='<a href="'.U($urlFuncParam.$i).'" class="item">'.$i.'</a>';
                }
            }
        }else{
            for($i=$currPage-4;$i<=$currPage+5;$i++){
                if($i==$currPage){
                    $html.='<a href="'.U($urlFuncParam.$i).'" class="item active">'.$i.'</a>';
                }else{
                    $html.='<a href="'.U($urlFuncParam.$i).'" class="item">'.$i.'</a>';
                }
            }
        }
    }
    if($currPage!=$totalPage){
        $html.='<a href="'.U($urlFuncParam.($currPage+1)).'" class="icon item"><i class="right chevron icon"></i></a>';
    }
    $html.="</div>";
    return $html;
}