标签 php 下的文章

  • 首先安装 EPEL 源:
yum install epel-release
  • 安装Remi存储库
dnf install dnf-utils http://rpms.remirepo.net/enterprise/remi-release-8.rpm
  • 更新系统默认的php模块
dnf module reset php  #重置php模块
dnf module enable php:remi-7.3  #默认设置为remi-7.3版本
  • 安装php7.3及一些常用模块
yum -y install php php-mysqlnd php-gd php-xml php-mbstring php-ldap php-pear php-xmlrpc php-zip
  • 安装完成
[root@localhost yum.repos.d]# php -v
PHP 7.3.19 (cli) (built: Jun  9 2020 08:06:30) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.19, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.3.19, Copyright (c) 1999-2018, by Zend Technologies
  • 配置php.ini
vim /etc/php.ini

执行composer install, composer update, php artisan tinker, php artisan cache:clear 等等等 . . .
都抛出下面的错误

  • 通过各种排查, 文件为下面这个路径的该文件
\vendor\laravel\framework\src\Illuminate\Container\Container.php
  • 最后问题还是解决了
在laravel的composer引入的公共文件中, 发现了使用request类的发放, 导致命令行无法正常的执行下去

  • 环境安装
yum install npm -y
npm install apidoc -g
apidoc -v
  • 在有文档的目录创建apidoc.json
{
  "name": "API名称",
  "version": "API主版本号,仅支持3位数字版本号,如:0.0.1",
  "description": "API描述信息",
  "title": "浏览器标题",
  "url": "可选,接口地址,如:http://wuloves.com/xxx",
  "sampleUrl": "可选,接口调用示例地址,如增加此项,则页面会增加可发送请求示例的操作项",
  "header": {
    "title": "可选,头部标题",
    "filename": "可选,头部文件路径,只支持.md文件"
  },
  "footer": {
    "title": "可选,底部描述",
    "filename": "可选,底部文件路径,只支持.md文件"
  },
  "template": {
    "withCompare": true, //是否允许版本之间进行比较
    "withGenerator": true//是否允许生成多个版本
  }
}
  • apidoc 使用说明
@api {get} /users/:user_id Request User Information
最主要的参数,”{get}”定义了HTTP请求是GET,API地址是”/users/:user_id”,文档中API的名称是”Request User Information”。
@apiVersion 0.1.0
API的版本号,默认显示在API名称的右方。该参数可用来在不同的版本之间做比较,后面会介绍。
@apiName GetUser
API名称,不影响文档。
@apiGroup User
API分组名,文档内容中和菜单栏中同一组的API会在一同显示,方便阅读。
@apiPermission admin
API的访问权限,文档中默认会API地址下面显示。没有权限要求的话,此项可以省略。
@apiDescription API to get the user information.
API的详细描述,默认显示在API名称的下方。
@apiExample Example usage:
API调用示例,该参数的下一行就是示例的内容,直到有空行结束。可以定义多个@apiExample,默认在文档中会以标签形式列出,标签名就是”Example usage:”。
@apiParam {Number} user_id The user’s unique ID.
API参数字段介绍,”{Number}”定义了字段类型,”user_id”是字段名称,后面则是字段描述。可以定义多个@apiParam字段。
@apiSuccess {String} name Name of the User.
API成功后返回的字段,如同@apiParam,”{String}”定义了字段类型,”name”是返回字段名称,后面则是字段描述。可以定义多个@apiSuccess字段。
@apiSuccessExample {json} Success-Response:
显示一个API成功返回后Response响应的示例,”{json}”代表响应体是JSON类型。该参数的下行就是响应体内容,直到有空行结束。可以定义多个@apiSuccessExample,默认在文档中会以标签形式列出,标签名就是”Success-Response:”。
@apiError UserNotFound User was not found.
API发生错误后的返回,”UserNotFound”是错误名称,后面则是错误描述。可以定义多个错误返回。
@apiErrorExample {json} Error-Response:
显示一个API错误返回后Response响应的示例,”{json}”代表响应体是JSON类型。该参数的下行就是响应体内容,直到有空行结束。可以定义多个@apiErrorExample,默认在文档中会以标签形式列出,标签名就是”Error-Response:”。
@apiSampleRequest http://localhost:5000/users/:user_id
文档提供的API Sample测试的地址。其实在”apidoc.json”中配过”sampleUrl”项后,此参数即可省去,除非这个API的测试URL比较特殊,需特别指定。

业务场景说明

  1. 比如扒人家的站点, 图片相对地址一个个的扒很不方便, 通过301重定向简单配置一下可以实现当图片没有下载到对应的相对位置时, 会自动重定向下载
  2. vue容器环境下, 每次发布新版本时, 保证缓存老代码的用户访问不会出现404js文件, 可以考虑一台机器用于存放这部分的js文件

保存到文件 auto_download_image.php

<?php
$host301 = "https://static.zennioptical.com" ;
if ($_SERVER["REQUEST_URI"]=='/' || substr( $_SERVER["REQUEST_URI"] ,strripos($_SERVER["REQUEST_URI"] , "/") )==str_replace(".","",substr( $_SERVER["REQUEST_URI"] ,strripos($_SERVER["REQUEST_URI"] , "/") ))  ){
    header("HTTP/1.1 404 Forbidden");
    echo $_SERVER["REQUEST_URI"] ;
    echo "<hr><a href='https://test.templete.com/b/all-glasses/_/category.html'>https://test.templete.com/b/all-glasses/_/category.html</a> ";
    echo "<hr><a href='https://www.zennioptical.com" . $_SERVER["REQUEST_URI"] . "' target='_blank'>https://www.zennioptical.com" . $_SERVER["REQUEST_URI"] . "</a> ";
    exit ;
}
if ( stripos($_SERVER["REQUEST_URI"] , "?") ){
    $file_url = $host301. substr( $_SERVER["REQUEST_URI"] , 0 ,stripos($_SERVER["REQUEST_URI"] , "?") )   ;
}else{
    $file_url = $host301. $_SERVER["REQUEST_URI"] ;
}
function SaveFileFromUrl($link) {
    echo $link ;
    $file_link = str_replace("//" ,"" , $link) ;
    $file_link = substr($file_link , stripos($file_link,"/")+1 ) ;
    $folder_link = substr($file_link , 0 ,strripos($file_link,"/")+1) ;
    $ch = curl_init ($link);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    $img = curl_exec ($ch);
    curl_close ($ch);

//     $fp = fopen($image_name,'w'); // 下载图片到根目录

    if ( $img ){
        if (!is_dir($folder_link)) mkdir($folder_link , 0777 , true); // 如果不存在则创建
        $fp = fopen($file_link,'wb'); //下载图片到指定文件夹
        fwrite($fp, $img);
        fclose($fp);
//    header("HTTP/1.1 404 Forbidden");
        Header("HTTP/1.1 302 Moved Permanently");
        Header("Location: /" . $file_link );
    }else {
        echo "error" ;
    }


}
SaveFileFromUrl($file_url);

在静态文件目录下保存一个 .htaccess 文件

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ ../auto_download_image.php [L]
</IfModule>