文章851
标签121
分类10

无法在服务器使用 `curl` 命令访问 HTTPS 域名的问题

在服务器上使用 curl 命令访问 HTTPS 域名时,可能会遇到一些问题。这些问题通常与 SSL/TLS 证书、网络配置、curl 配置等有关。以下是一些常见问题及其解决方案。

1. 检查 curl 是否已安装

首先,确保您的服务器上已经安装了 curl。可以通过以下命令检查:

curl --version

如果未安装,可以使用以下命令安装:

在 Debian/Ubuntu 系统上:

sudo apt update
sudo apt install curl

在 CentOS/RHEL 系统上:

sudo yum install curl

2. 检查网络连接

确保您的服务器能够连接到互联网。可以使用 ping 命令测试网络连接:

ping google.com

如果无法 ping 通,您可能需要检查网络配置或防火墙设置。

3. 证书问题

如果 curl 无法访问 HTTPS 域名,可能是由于 SSL/TLS 证书问题。您可以使用 -k--insecure 选项忽略证书验证(不推荐在生产环境中使用):

curl -k https://example.com

3.1 更新 CA 证书

确保您的 CA 证书是最新的。可以通过以下命令更新 CA 证书:

在 Debian/Ubuntu 系统上:

sudo apt install --reinstall ca-certificates

在 CentOS/RHEL 系统上:

sudo yum reinstall ca-certificates

4. 检查防火墙设置

如果您的服务器上启用了防火墙,确保允许出站 HTTPS 流量(端口 443)。您可以使用以下命令检查防火墙状态:

在 CentOS/RHEL 上使用 firewalld

sudo firewall-cmd --list-all

在 Ubuntu 上使用 ufw

sudo ufw status

如果需要添加规则以允许 HTTPS 流量,可以使用以下命令:

在 CentOS/RHEL:

sudo firewall-cmd --add-service=https --permanent
sudo firewall-cmd --reload

在 Ubuntu:

sudo ufw allow https

5. 使用 -v 选项调试

使用 curl-v 选项可以启用详细模式,帮助您调试问题:

curl -v https://example.com

这将显示请求和响应的详细信息,包括 SSL/TLS 握手过程。

6. 检查 DNS 配置

如果 DNS 配置不正确,可能导致无法访问特定域名。您可以使用 nslookupdig 命令检查 DNS 解析:

nslookup example.com

如果 DNS 解析失败,您可能需要检查 /etc/resolv.conf 文件中的 DNS 服务器配置。

7. 其他可能的问题

  • SELinux:在某些情况下,SELinux 可能会阻止 curl 访问网络。您可以暂时禁用 SELinux 来检查是否是这个问题:

    sudo setenforce 0
  • 代理设置:如果您在使用代理服务器,确保 curl 的代理设置正确。可以通过环境变量设置代理:

    export http_proxy=http://proxy.example.com:port
    export https_proxy=https://proxy.example.com:port

在 Linux 中查看 YUM 历史安装软件列表

YUM(Yellowdog Updater Modified)是 Red Hat 系列 Linux 的一个包管理工具。通过 YUM,您可以轻松地安装、更新和管理软件包。在使用 YUM 时,有时您可能需要查看历史安装的软件列表,以便进行系统维护或故障排除。本文将介绍如何查看 YUM 的历史安装记录。

1. 查看 YUM 历史

YUM 提供了一个命令来查看所有的历史事务,包括安装、更新和删除软件包。这可以通过以下命令实现:

yum history

示例输出

执行上述命令后,您将看到类似如下的输出:

ID     | Command Line            | Date and Time    | Action(s)      | Altered
-------------------------------------------------------------------------------
  10   | install httpd          | 2024-01-15 10:00 | Install        |   1
  9    | update                  | 2024-01-14 09:00 | Upgrade        |   5
  8    | remove nginx            | 2024-01-13 08:00 | Erase          |   1
  • ID:每次操作的唯一标识符。
  • Command Line:执行的命令行。
  • Date and Time:操作的日期和时间。
  • Action(s):执行的操作类型(安装、更新、删除)。
  • Altered:受影响的包数量。

2. 查看特定历史记录

如果您想查看某个特定 ID 的详细信息,可以使用以下命令:

yum history info <ID>

示例

yum history info 10

示例输出

Transaction ID : 10
Begin time     : Thu Jan 15 10:00:00 2024
Begin rpmdb    : Thu Jan 15 09:59:59 2024
End time       : Thu Jan 15 10:00:30 2024
End rpmdb      : Thu Jan 15 10:00:30 2024
User           : root <root>
Host           : localhost.localdomain
Command Line   : install httpd
Transaction performed with:
    Installed     yum-3.4.3-167.el7.centos.noarch        @base
    Installed     httpd-2.4.6-93.el7.x86_64               @base
    ...

3. 查看已安装软件包列表

如果您只想查看当前已安装的软件包列表,可以使用以下命令:

yum list installed

这将列出所有已安装的软件包及其版本信息。

示例输出

Installed Packages
httpd.x86_64              2.4.6-93.el7                 @base
nginx.x86_64              1.16.1-1.el7                 @epel

另类的遍历PHP数组方法

在 PHP 中,遍历数组有多种方法,除了常见的 foreachfor 循环之外,还有一些另类的方法可以让代码更具可读性或更具趣味性。以下是一些不同的遍历数组的方法:

1. 使用 array_walk()

array_walk() 函数可以遍历数组并对每个元素应用一个回调函数。

示例

$array = [1, 2, 3, 4, 5];

array_walk($array, function($value, $key) {
    echo "Key: $key; Value: $value\n";
});

2. 使用 array_map()

array_map() 函数对数组的每个元素应用回调函数,并返回一个新数组。

示例

$array = [1, 2, 3, 4, 5];

$newArray = array_map(function($value) {
    return $value * 2;
}, $array);

print_r($newArray);

3. 使用生成器(Generators)

生成器可以在遍历大数组时节省内存。可以使用 yield 关键字创建生成器。

示例

function getArray() {
    yield from [1, 2, 3, 4, 5];
}

foreach (getArray() as $value) {
    echo "$value\n";
}

4. 使用 array_reduce()

array_reduce() 函数可以将数组缩减为单一的值,通常用于累加或组合。

示例

$array = [1, 2, 3, 4, 5];

$sum = array_reduce($array, function($carry, $item) {
    return $carry + $item;
});

echo "Sum: $sum\n";

5. 使用 array_keys()array_values()

通过 array_keys()array_values() 函数,可以分别获取数组的键和值,然后进行遍历。

示例

$array = ['a' => 1, 'b' => 2, 'c' => 3];

foreach (array_keys($array) as $key) {
    echo "Key: $key; Value: " . $array[$key] . "\n";
}

6. 使用 array_column()

当数组是多维数组时,可以使用 array_column() 提取出某个列,然后进行遍历。

示例

$array = [
    ['name' => 'Alice', 'age' => 25],
    ['name' => 'Bob', 'age' => 30],
    ['name' => 'Charlie', 'age' => 35],
];

$names = array_column($array, 'name');
foreach ($names as $name) {
    echo "$name\n";
}

7. 使用 for 循环与 count()

虽然 foreach 更常用,但您也可以使用 for 循环结合 count() 遍历数组。

示例

$array = [1, 2, 3, 4, 5];

for ($i = 0; $i < count($array); $i++) {
    echo "Value: " . $array[$i] . "\n";
}

8. 使用 array_filter() 结合 foreach

您可以先过滤数组,然后再进行遍历。

示例

$array = [1, 2, 3, 4, 5, 6];

$evenNumbers = array_filter($array, function($value) {
    return $value % 2 == 0;
});

foreach ($evenNumbers as $value) {
    echo "Even Number: $value\n";
}

Nginx 访问 IP 数量统计

在 Nginx 中,您可以通过多种方式统计访问的 IP 数量。以下是几种常用的方法来实现这一目标。

1. 使用 Nginx 日志

Nginx 通常会记录访问日志,您可以通过分析这些日志来统计访问的 IP 数量。

1.1 配置 Nginx 日志

确保在您的 Nginx 配置文件中启用了访问日志。默认情况下,访问日志通常在 /var/log/nginx/access.log。配置示例如下:

http {
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                   '$status $body_bytes_sent "$http_referer" '
                   '"$http_user_agent" "$http_x_forwarded_for"';

    access_log /var/log/nginx/access.log main;
}

1.2 统计 IP 数量

使用以下命令分析访问日志,统计唯一的 IP 地址数量:

cat /var/log/nginx/access.log | awk '{print $1}' | sort | uniq | wc -l

1.3 解释命令

  • cat /var/log/nginx/access.log:输出日志内容。
  • awk '{print $1}':提取每行的第一个字段,即 IP 地址。
  • sort:对 IP 地址进行排序。
  • uniq:去重,保留唯一的 IP 地址。
  • wc -l:统计行数,即唯一 IP 的数量。

2. 使用 Nginx 统计模块

Nginx 也可以通过一些第三方模块来直接统计访问 IP 数量,例如 ngx_http_stub_status_module

2.1 启用状态模块

在 Nginx 配置文件中添加如下配置:

server {
    location /nginx_status {
        stub_status on;
        allow 127.0.0.1;  # 只允许本地访问
        deny all;         # 拒绝其他访问
    }
}

2.2 访问状态页面

使用浏览器或 curl 访问状态页面:

curl http://localhost/nginx_status

这将显示连接数和其他状态信息,但不直接提供 IP 数量。

3. 使用阿尔法或日志分析工具

还有一些工具专门用于分析 Nginx 日志文件,例如:

  • GoAccess:一个实时的日志分析工具,可以提供详细的访问统计。
  • AWStats:一个强大的日志分析工具,可以生成图形化报告。

3.1 安装 GoAccess

在 Debian/Ubuntu 上可以使用以下命令安装:

sudo apt install goaccess

3.2 使用 GoAccess 分析日志

goaccess /var/log/nginx/access.log --log-format=COMBINED -o report.html

这将生成一个 HTML 格式的报告,您可以在浏览器中查看。

PHP团队代码规范

今天看同事的代码非常闹心, 也许是我个人问题吧. 我认为 团队开发前一定要制订一份 开发规范. 在国外可以挽救你的生命, 百度了一份看上去不错的规范 自己改了一些 .

一、基本约定

1、源文件

(1)纯PHP代码源文件只使用 <?php 标签,省略关闭标签 ?> ;

(2)源文件中PHP代码的编码格式必须是无BOM的UTF-8格式;

(3)使用 Unix LF(换行符)作为行结束符;

(4)一个源文件只做一种类型的声明,即,这个文件专门用来声明Class, 那个文件专门用来设置配置信息,别混在一起写;

2、缩进

使用Tab键来缩进,每个Tab键长度设置为4个空格;

3、行

一行推荐的是最多写120个字符,多于这个字符就应该换行了,一般的编辑器是可以设置的。

4、关键字 和 True/False/Null

PHP的关键字,必须小写,boolean值:truefalsenull 也必须小写。

下面是PHP的“关键字”,必须小写:

 '__halt_compiler', 'abstract', 'and', 'array', 'as', 'break', 'callable', 'case', 'catch', 'class', 'clone', 'const', 'continue', 'declare', 'default', 'die', 'do', 'echo', 'else', 'elseif', 'empty', 'enddeclare', 'endfor', 'endforeach', 'endif', 'endswitch', 'endwhile', 'eval', 'exit', 'extends', 'final', 'for', 'foreach', 'function', 'global', 'goto', 'if', 'implements', 'include', 'include_once', 'instanceof', 'insteadof', 'interface', 'isset', 'list', 'namespace', 'new', 'or', 'print', 'private', 'protected', 'public', 'require', 'require_once', 'return', 'static', 'switch', 'throw', 'trait', 'try', 'unset', 'use', 'var', 'while', 'xor'

5、命名

(1)类名 使用大驼峰式(StudlyCaps)写法;

(2)(类的)方法名 使用小驼峰(cameCase)写法;

(3)函数名使用小驼峰写法,如 function httpSendPost();

(4)变量名 使用小驼峰写法,如 $userName;

6、代码注释标签

如 函数注释、变量注释等,常用标签有 @package、@var、@param、@return、@author、@todo、@throws

7、业务模块

(1)涉及到多个数据表 更新/添加 操作时,最外层要用事务,保证数据库操作的原子性;

(2)Model层,只做简单的数据表的查询;

(3) 业务逻辑统一封装到 Logic层;

(4)控制器只做URL路由,不要当作 业务方法 调用;

(5)、控制器层不能出现SQL操作语句,如 ThinkPHP框架的 where()、order() 等模型方法,

即,控制器中,不要出现类似这样的SQL语句:D('XXX')->where()->order()->limit()->find();

where()order()limit() 等SQL方法只能出现在 Model层、业务层!

二、代码样式风格

1、命名空间(Namespace) 和 导入(Use)声明

先简单文字描述下:

命名空间(namespace)的声明后面必须有一行空行;
所有的导入(use)声明必须放在命名空间(namespace)声明的下面;
一句声明中,必须只有一个导入(use)关键字;
在导入(use)声明代码块后面必须有一行空行;
用代码来说明下:

<?php
namespace Lib\Databases; // 下面必须空格一行
 
class Mysql {
 
}

namespace下空一行,才能使用use,再空一行,才能声明class

<?php
namespace Lib\Databases; // 下面必须空格一行
 
use FooInterface; // use 必须在namespace 后面声明
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass; // 下面必须空格一行
 
class Mysql {
 
}

2、类(class),属性(property)和方法(method)

(1)继承(extends) 和实现(implement) 必须和 class name 写在一行。

<?php
namespace Lib\Databaes;
 
class Mysql extends ParentClass implements \PDO, \DB { // 写一行
 
}

(2)属性(property)必须声明其可见性,到底是 public 还是 protected 还是 private,不能省略,也不能使用var, var是php老版本中的什么方式,等用于public。

<?php
namespace Lib\Databaes;
 
class Mysql extends ParentClass implements \PDO, \DB { // 写一行
    // 空一行
    public $foo = null;
    private $name = 'yangyi';
    protected $age = '17';
}

(3)方法(method),必须 声明其可见性,到底是 public 还是 protected 还是 private,不能省略。如果有多个参数,第一个参数后紧接“,” ,再加一个空格:function_name ([Math Processing Error]
par2, $pa3), 如果参数有默认值,“=”左右各有一个空格分开。

<?php
namespace Lib\Databaes;
 
class Mysql extends ParentClass implements \PDO, \DB { // 写一行
    // 空一行
    public getInfo($name, $age, $gender = 1)  // 参数之间有一个空格。默认参数的“=”左右各有一个空格,) 与 { 之间有一个空格
    {
 
    }
}

(4)当用到抽象(abstract)和终结(final)来做类声明时,它们必须放在可见性声明 (public 还是protected还是private)的前面。而当用到静态(static)来做类声明时,则必须放在可见性声明的后面。

直接上代码:

<?php
namespace Vendor\Package;
 
abstract class ClassName {
    protected static $foo; // static放后面
    abstract protected function zim(); // abstract放前面
 
    final public static function bar() // final放前面,static放最后。
    { 
        // 方法主体部分
    }
}

3、控制结构

控制接口,就是 if else while switch等。这一类的写法规范也是经常容易出现问题的,也要规范一下。

(1)ifelseifelse写法,直接上规范代码吧:

<?php
if ($expr1) { // if 与 ( 之间有一个空格,) 与 { 之间有一个空格
 
} elseif ($expr2) { // elesif 连着写,与 ( 之间有一个空格,) 与 { 之间有一个空格
 
} else { // else 左右各一个空格
 
}

(2)switchcase 注意空格和换行,还是直接上规范代码:

<?php
switch ($expr) { // switch 与 ( 之间有一个空格,) 与 { 之间有一个空格
    case 0:
        echo 'First case, with a break'; // 对齐
        break; // 换行写break,也对齐。
    case 1:
        echo 'Second case, which falls through';
        // no break
    case 2:
    case 3:
    case 4:
        echo 'Third case, return instead of break';
        return;
    default:
        echo 'Default case';
        break;
}

(3)whiledo while 的写法也是类似,上代码:

<?php
while ($expr) { // while 与 ( 之间有一个空格, ) 与 { 之间有一个空格
 
}
 
do { // do 与 { 之间有一个空格
 
} while ($expr); // while 左右各有一个空格

(4)for的写法

<?php
for ($i = 0; $i < 10; $i++) { // for 与 ( 之间有一个空格,二元操作符 "="、"<" 左右各有一个空格,) 与 { 之间有一个空格
 
}

(5)foreach的写法

<?php
foreach ($iterable as $key => $value) { // foreach 与 ( 之间有一个空格,"=>" 左右各有一个空格,) 与 { 之间有一个空格
 
}

(6)try catch的写法

<?php
try { // try 右边有一个空格
 
} catch (FirstExceptionType $e) { // catch 与 ( 之间有一个空格,) 与 { 之间有一个空格
 
} catch (OtherExceptionType $e) { // catch 与 ( 之间有一个空格,) 与 { 之间有一个空格
 
}

4、注释

(1)行注释

// 后面需要加一个空格;

如果 // 前面有非空字符,则 // 前面需要加一个空格;

(2)函数注释

参数名、属性名、标签的文本 上下要对齐;

在第一个标签前加一个空行;

<?php
/**
 * This is a sample function to illustrate additional PHP
 * formatter options.
 *
 * @param        $one   The first parameter
 * @param int    $two   The second parameter
 * @param string $three The third parameter with a longer
 *                      comment to illustrate wrapping.
 * @return void
 * @author  52php.cnblogs.com
 * @license GPL
 */
function foo($one, $two = 0, $three = "String") 
{
 
}

5、空格

(1)赋值操作符(=,+= 等)、逻辑操作符(&&,||)、等号操作符(==,!=)、关系运算符(<,>,<=,>=)、按位操作符(&,|,^)、连接符(.) 左右各有一个空格;

(2)ifelseelseifwhiledoswitchforforeachtrycatchfinally 等 与 紧挨的左括号“(”之间有一个空格;

(3)函数、方法的各个参数之间,逗号(",")后面有一个空格;

6、空行

(1)所有左花括号 { 都不换行,并且 { 紧挨着的下方,一定不是空行;

(2)同级代码(缩进相同)的 注释(行注释/块注释)前面,必须有一个空行;

(3)各个方法/函数 之间有一个空行;

(4)namespace语句、use语句、clase语句 之间有一个空行;

(5)return语句

如果 return 语句之前有代码,return 语句之前加一个空行;

(6)if,while,switch,for,foreach、try 等代码块之间 以及 与其他代码之间有一个空行;

7、数组 的书写格式

只有一个键值对时,就写成一行:

$where = array('id' => 789);

有多个(二个或二个以上)键值对时,就换行:

$where = array(
    'id' => 789,
    'user_name' => '52php'
);

【参考示例 汇总】

参考1:

<?php
namespace Lib\Databaes;
 
class Mysql extends ParentClass implements \PDO, \DB { // 写一行
        
    public getInfo($name, $age, $gender = 1) // 参数之间有一个空格。默认参数的“=”左右各有一个空格,) 与 { 之间有一个空格
    { 
 
    }
}

参考2:

<?php
namespace Vendor\Package;
 
abstract class ClassName {
    protected static $foo; // static放后面
    abstract protected function zim(); // abstract放前面
 
    final public static function bar() // final放前面,static放最后。
    { 
        // 方法主体部分
    }
}

参考3:

<?php
namespace library\Model;
 
use library\Helper\ImageHelper;
use library\Logic\UserMainLogic;
 
/**
 * 用户表 数据模型
 *
 * @package library\Model
 */
class UserMainModel extends BasicModel {
     /**
     * 获得用户统计信息
     *
     * @param int $userId 用户ID
     * @return array
     */
    public function getUserCard($userId) 
    {
        $userId = intval($userId);

        return UserMainLogic::instance()->getUserCard($userId);
    }
 
    /**
     * 根据Id 获取用户信息
     *
     * @param int    $userId 用户Id
     * @param string $field  显示字段
     * @return array
     */
    public function getByUserId($userId = 0, $field = '*') 
    {
        if (empty($userId)) {
            return array();
        }
 
        $where = array('id' => $userId);
        $info = $this->field($field)->where($where)->find();
 
        if (isset($info['image']) && isset($info['sex'])) {
            $info['image'] = ImageHelper::GetImageUrl($info['image'], $info['sex']);
        }
 
        return $info;
    }
}

书写原则:做到 代码紧凑 而又不失 小模块化 !

PSR-4 规范

PSR-4规范是刚出没多久的一条新的规范,它也是规范 自动加载(autoload)的,是对PSR-0的修改,属于补充规范,

我简单说下,主要是以下几点:

废除了PSR-0中_就是目录分割符的写法,_下划线在完全限定类名中是没有特殊含义了。
类文件名要以 .php 结尾。
类名必须要和对应的文件名要一模一样,大小写也要一模一样。
方法参数不能超过7个参数
方法内有效代码行数不超过50行 (不包含注释)

基本全是照抄而来 但也符合我个人代码规范 , 原文地址: https://www.cnblogs.com/52php/p/5841210.html

">