0%

注:本文只讨论进程监听时三个地址的区别。

通俗地讲

  • 127.0.0.1代表本机地址。比如,一个进程监听了127.0.0.1:8080,只有本机的其他进程才可以访问,外网或局域网的进程无法访问。

  • localhost指向127.0.0.1,可以理解为是127.0.0.1的别名,定义在/etc/hosts(OS: *nixes)文件中。

  • 0.0.0.0代表本机器的所有地址,不仅包括:127.0.0.1,还包括本机其他地址。比如,本机除了127.0.0.1,还包括两个局域网IP192.168.0.8,10.10.0.8,当某个进程监听0.0.0.0:8080,本机进程通过127.0.0.1:8080、局域网A通过192.168.0.8:8080、局域网B通过10.10.0.8:8080都可以访问该进程。

阅读全文 »

(具体定义和意义不再复述)

版本

PHP 7.2.34

用法

  1. namespace用于声明一个命名空间

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
    # 声明一个命名空间:app
    namespace app;
    # print: app
    echo __NAMESPACE__;

    # 声明一个命名空间:app\controllers
    namespace app\controllers;
    # print: app\controllers
    echo __NAMESPACE__;
    ?>
    • namespace后路径被解析为”全局空间路径”,不能带前缀’\‘,有则报错
    • 不能以’\‘结尾,有则报错
    • The Namespace name PHP, and compound names starting with this name (like PHP\Classes) are reserved for internal language use and should not be used in the userspace code.

    • 如上例一个文件可以声明多个命名空间,但通常不建议这么做
    • 同一个命名空间可在多个文件中声明
阅读全文 »

场景

如果客户端的HTTP请求是直连Nginx,则可以通过$remote_addr$remote_port获取客户端的真实IP、端口,以此进行限流、过滤等操作。但若Nginx放在CDN、SLB后面,CDN、SLB转发客户端的HTTP请求到Nginx,$remote_addr$remote_port返回的是CDB、SLB连接Nginx的IP、端口。

当请求经过CDN、SLB转发后,为了上游服务器能获取到用户的真实IP和端口,业界的标准是在转发HTTP请求时,添加指定的头部字段用于保存客户的真实IP和端口,通常是X-Real-IP或者X-Forwarded-For。比如当使用阿里云的CDN时,X-Forwarded-For字段就存储客户端的真实IP、端口。

为此Nginx提供了HTTP Real IP模块,在Nginx的POST_READ阶段,将$remote_addr$remote_port替换为HTTP请求头中指定字段内的IP、端口,进而后续再进行限流、过滤等操作

阅读全文 »

原文

译文

当通过PHP访问一个数据库时,我们有两个选择MySQLi和PDO。那么在做出选择之前,有哪些知识你应该了解呢。本文将概述差异、支持的数据库、稳定性和性能问题等方面。

如果你经常在PHP中操作数据库,你可能想看看在Envato Market上有哪些同时支持MySQLi和PDO的可用脚本和APP。

阅读全文 »

报错

  • 执行:
1
2
-- 示例
select y from z group by x;
  • 报错:

    ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘x.y.z’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

  • 粗略翻译:
    SELECT列表里的第一个表达式(注:示例中的”x”)不在GROUP BY列中,而且包含了非功能性依赖于GROUP BY列的非汇总列‘x.y.z’,对于sql_mode=only_full_group_by模式是不兼容的。

  • 问题:

    • SELECT列表里包含了未在GROUP BY语句中出现的列
    • SELECT列表包含了非汇总列,而非汇总列又不功能性依赖于GROUP BY中的列
    • 这两种情况与sql_mode=only_full_group_by不兼容
阅读全文 »

场景

.user.ini文件放置于PHP项目的目录下,用于对具体项目的进行更灵活的配置。常见的文件内容如下:

1
2
;Limit the files that can be accessed by PHP to the specified directory-tree, including the file itself.
open_basedir=/home/test/pro:/tmp/:/proc/:/var/tmp/

open_basedir限制PHP对于指定文件的访问权限

阅读全文 »

1. 环境

  • Nginx
  • PHP-FPM

2. 背景

线上环境偶尔会出现请求 504 Gateway Time-out 的情况。初步排查 timeout 和Nginx和PHP-FPM配置有关,以下为线上服务器可能相关配置以及具体数值(单位都是:秒):

2.1 Nginx

  • fastcgi_connect_timeout 3000;
    Defines a timeout for establishing a connection with a FastCGI server. It should be noted that this timeout cannot usually exceed 75 seconds.
  • fastcgi_send_timeout 3000;
    Sets a timeout for transmitting a request to the FastCGI server.
  • fastcgi_read_timeout 3000;
    Defines a timeout for reading a response from the FastCGI server.
阅读全文 »

Tables

table 是 Lua 中最重要的数据结构,数组、关联数组、集合、队列等都可以用table表示,若用 Lua 实现面向对象编程,class 也用 table 表示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
-- test.lua
-- 定义数组
local test = {'a', 'b', 'c', 'd'}

-- 遍历
for k, v in pairs(test) do
print('index: ' .. k .. ' value: ' .. v)
end
-- 按索引读取
print(test[1])

-- 定义关联数组
local test1 = {
abc = 123, -- 注意:此处abc不用加引号
}
-- 关联数组赋值,此处 def 需要加引号
test1['def'] = 234

for k, v in pairs(test1) do
print('index: ' .. k .. ' value: ' .. v)
end
print(test1['def'])

阅读全文 »

Birthday problem

Birthday problem 很经典,即在一群人中,求有两个人同一天生日的概率有多大。一种错觉是,假设一年365天(什么闰年等特殊情况都不考虑),那么最少要366个人,才一定能满足有两个人同一天生日,这么看来,要满足两个人同一天生日也需要一个很大的总体人数。

既然是错觉,那一定不对。

计算相同生日的概率P(A)很麻烦,两个人一天,三个人一天。。。。那这么求起来就没头了。这个问题我们如果求P(A)的补集P(A’),那么 P(A) = 1 - P(A’)。P(A’)即集合中没有任何两个人有相同生日的概率,每个人的生日都是唯一的。

阅读全文 »