PHP file_get_contents(): SSL operation failed with code 1. OpenSSL Error message

在调试php脚本代码时,发现使用 file_get_contents() 函数请求HTTPS的网址链接时出现了报错,其报错代码如下面所示“file_get_contents(): SSL operation failed with code 1. OpenSSL Error message…”百度查了一下原因与解决方法,下面就来分享一下。

原因:

服务器上未能正确配置好https证书,所以出现了错误。

1、方法1:

(1)、下载证书,http://curl.haxx.se/ca/cacert.pem

(2)、证书上传到服务器,并记录好上传的路径

(3)、打开php的配置文件,php.ini

(4)、修改 openssl.cafile 的配置的值为上传的证书地址即可

 

2、方案二 直接对 file_get_contents 函数进行设置,让 file_get_contents 函数跳过https验证,暂时解决问题

$url = ‘请求地址’;
$arrContextOptions=array(
“ssl”=>array(
“verify_peer”=>false,
“verify_peer_name”=>false,
“allow_self_signed”=>true,
),
);
$response = file_get_contents($url, false, stream_context_create($arrContextOptions));

3、方案三 使用curl来替代 file_get_contents 函数来使用!

$url = ‘请求地址’;
function getSSLPage($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSLVERSION,3);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
var_dump(getSSLPage($url));

 

宝塔的thinkphp伪静态

宝塔的ThinkPHP伪静态是通过Nginx或Apache的Rewrite规则来实现的,用于将动态的URL转化为静态的URL,以提高网站的SEO优化和用户体验。

location / {
    if (!-e $request_filename) {
        rewrite ^/(.*)$ /index.php?s=$1 last;
        break;
    }
}

其中,/index.php是指向网站入口文件的路径,$1是指匹配到的参数。

对于Apache来说,可以在.htaccess文件中添加如下代码:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /index.php?s=$1 [QSA,PT,L]

其中,/index.php是指向网站入口文件的路径,$1是指匹配到的参数。

php循环创建目录,linux下授权0777权限。

/**
* 循环创建文件夹
* @param string $dir 需要创建的文件夹路径
* @param integer $mode 文件夹权限
* @return bool 返回创建是否成功
*/
function makedir($dir, $mode = 0777)
{
if (is_dir($dir)) {
return true;
} else if (!is_dir(dirname($dir)) && !call_user_func(__FUNCTION__, dirname($dir), $mode)) {
return false;
}
return mkdir($dir, $mode);
}

获得客户端真实ip

$ip=FALSE;

    //客户端IP 或 NONE

    if(!empty($_SERVER["HTTP_CLIENT_IP"])){

        $ip = $_SERVER["HTTP_CLIENT_IP"];

    }

    //多重代理服务器下的客户端真实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 (!eregi ("^(10│172.16│192.168).", $ips[$i])) {

                $ip = $ips[$i];

                break;

            }

        }

    }

    //客户端IP 或 (最后一个)代理服务器 IP

    return ($ip ? $ip : $_SERVER['REMOTE_ADDR']);

PHP获取客户端真实IP地址的方法 https://www.php.cn/php-weizijiaocheng-406174.html

thinkphp5随机抽取数据的方法

/**
 * 随机获取数据
 * @param string $num  抽取条数
 * @param string $table    表名
 * @param string $where    查询条件
 * @return array 
 */
function tt_random_data($num,$table,$where=[])
{
    $pk = Db::name($table)->getPK();//获取主键
    $countcus = Db::name($table)->where($where)->field($pk)->select();//查询数据
    $con = '';
    $qu = '';
    foreach($countcus as $v=>$val){
        $con.= $val[$pk].'|';
    }
    $array = explode("|",$con);
    $countnum = count($array)-1;
    for($i = 0;$i <= $num;$i++){
        $sunum = mt_rand(0,$countnum);
        $qu.= $array[$sunum].',';
    }
    $list = Db::name($table)->where($pk,'in',$qu)->limit(0,$num)->select();
    return $list;
}

亲测有效。

serialize和unserialize函数 与base64_encode和base64_decode

序列化是将变量转换为可保存或传输的字符串的过程;反序列化就是在适当的时候把这个字符串再转化成原来的变量使用。这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性。
1. serialize和unserialize函数
这两个是序列化和反序列化PHP中数据的常用函数。

复制代码
<?php
$a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut'); 
//序列化数组
$s = serialize($a);
echo $s;
//输出结果:a:3:{s:1:"a";s:5:"Apple";s:1:"b";s:6:"banana";s:1:"c";s:7:"Coconut";}
echo '<br /><br />';
//反序列化
$o = unserialize($s);
print_r($o);
//输出结果 Array ( [a] => Apple [b] => banana [c] => Coconut ) 
?>
复制代码

 

当数组值包含如双引号、单引号或冒号等字符时,它们被反序列化后,可能会出现问题。为了克服这个问题,一个巧妙的技巧是使用base64_encode和base64_decode。

$obj = array();
//序列化
$s = base64_encode(serialize($obj)); 
//反序列化
$original = unserialize(base64_decode($s));

 

但是base64编码将增加字符串的长度。为了克服这个问题,可以和gzcompress一起使用。

复制代码
//定义一个用来序列化对象的函数
function my_serialize( $obj ) 
{ 
   return base64_encode(gzcompress(serialize($obj))); 
} 
//反序列化
function my_unserialize($txt) 
{ 
   return unserialize(gzuncompress(base64_decode($txt))); 
}