php

nginx反向代理实现服务器瞬间故障转移

我正在使用nignx作为反向代理.我想将我的所有请求发送到我的第一台服务器.如果第一台服务器关闭,我想向第二台服务器发送请求.

阅读全文

slb

负载均衡(Server Load Balancer,下文简称 SLB)的引入,可以降低单台云服务器 ECS(下文简称 ECS)出现异常时对业务的冲击,提升业务的可用性。同时,结合弹性伸缩服务,通过动态调整后端服务器,可以快速对业务进行弹性调整(扩容或缩容),以快速应对业务的发展。 https://developer.aliyun.com/article/272277

SLB功能介绍 SLB(Server Load Balance)服务通过设置虚拟服务地址(IP),将位于同一地域(Region)的多台云服务器(Elastic Compute Service,简称ECS)资源虚拟成一个高性能、高可用的应用服务池;再根据应用指定的方式,

https://developer.aliyun.com/article/1803

整个SLB系统由3部分构成:四层负载均衡,七层负载均衡 和 控制系统,如下图所示;

阅读全文

nginx的11个阶段

https://iziyang.github.io/2020/04/12/5-nginx/

阅读全文

openresty

curl -O https://openresty.org/download/openresty-1.17.8.2.tar.gz

阅读全文

autoconf

% phpize Configuring for: PHP Api Version: 20170718 Zend Module Api No: 20170718 Zend Extension Api No: 320170718 Cannot find autoconf. Please check your autoconf installation and the $PHP_AUTOCONF environment variable. Then, rerun this script.

阅读全文

proxy_pass

FastCGI 是一个协议,它是应用程序和 WEB 服务器连接的桥梁。Nginx 并不能直接与 PHP-FPM 通信,而是将请求通过 FastCGI 交给 PHP-FPM 处理。

阅读全文

phpstorm

lsof -i |grep phpstorm phpstorm 447 didi 229u IPv6 0xd274ec0aa095b047 0t0 TCP localhost:6943 (LISTEN) phpstorm 447 didi 341u IPv6 0xd274ec0aa09597c7 0t0 TCP localhost:63342 (LISTEN)

阅读全文

php静态分析

phpdoc https://docs.phpdoc.org/latest/packages/phpDocumentor-AST.html

阅读全文

php-code-coverage

https://github.com/sebastianbergmann/php-code-coverage https://github.com/sebastianbergmann/php-code-coverage/blob/master/src/CodeCoverage.php

阅读全文

phpgc

回收的支持。当变量赋值、传递时,会增加 value 的引用数, unset、return 等释放变量时再减掉引用数,减掉后如果发现 refcount 变为 0 则直接释放 value,这是变量的基本回收过程。

阅读全文

mapReduce

mapper.php reducer.php

阅读全文

JsonSerializable

PHP 中 json_encode() 只将索引数组(indexed array)转为数组格式,而将关联数组(associative array)转为对象格式。

阅读全文

getParams yaf

get(‘name’) //获取参数(不仅仅是get方法,也可以是post方法),没有返回NULL,需要传入一个参数名,字符串形式,也只能获取到单个的参数 getPost() //获取post参数, getQuery() //获取url地址及参数,不需要传入参数 /User/User/index/name/huyouheng/age/23 getParam(‘name’) //得到指定的参数 getParams() //得到传入的所有参数 getRequestUri() //得到请求的url,其实得到的和 getQuery()一致的 getMethod() //得到请求的方法 getFiles() //上传的文件 https://www.jianshu.com/p/3157563e87be http://www.shixinke.com/php/yaf-request-and-response

阅读全文

xdebug_debug_zval

众所周知php的变量都是通过zend引擎来处理的 而zval结构体则是管理我们变量的一个容器 而 xdebug_debug_zval 函数则是我们调试 zval结构体的一个好工具

阅读全文

scoreboard

记分板是保存FPM池及其工作线程状态的结构。它是在共享内存中创建的,如果无法分配该内存,则会记录错误。

阅读全文

symfony console VarDumper

#!/usr/bin/env php <?php // application.php

阅读全文

phan

https://github.com/phan/phan https://www.fzb.me/2017-7-18-static-analysis-in-php.html Phan倾向于避免假阳性,试图证明不正确性,而不是正确性。

阅读全文

php parser

https://github.com/nikic/PHP-Parser Parsing PHP 5 and PHP 7 code into an abstract syntax tree (AST). Invalid code can be parsed into a partial AST. The AST contains accurate location information.

阅读全文

box

https://learnku.com/articles/22370 https://github.com/box-project/box https://github.com/box-project/box2 https://github.com/box-project/box/blob/master/doc/configuration.md#compactors-compactors

阅读全文

cow

https://www.researchgate.net/publication/220997065_Copy-on-write_in_the_PHP_language

阅读全文

array_merge

array_merge 两个参数必须都是array,否则会返回null 即使是arrayObject也不行,必须getArrayCopy

阅读全文

php 500

$a=[‘a’=>124,’b’=>’23d’]; var_dump((string)$a);//Array,卡死 500 没有php-error var_dump(string($a));//php-error https://icocos.github.io/2018/12/25/PHP%E2%80%94%E2%80%94%E6%9C%8D%E5%8A%A1%E5%99%A8500%E9%94%99%E8%AF%AF%E6%80%BB%E7%BB%93/

阅读全文

get_called_class

在一定的需求场景下,你有一个父类和一些子类,你需要获取这些子类的实例又不想在每个子类中写重复的getInstance()方法。

阅读全文

swoole

https://newt0n.github.io/2017/02/10/PHP-%E5%8D%8F%E7%A8%8B%E5%8E%9F%E7%90%86/

阅读全文

call_user_function_ex 扩展调用php脚本函数

其中可能我认为最关键的应该是在PHP扩展里怎么调用用户空间里的函数了!对于一个framework来说,最基本的功能就是路由到请求对应的Action了。

阅读全文

php扩展实现多线程

在PHP扩展里是通过 call_user_function_ex 函数来调用用户空间的函数的。

阅读全文

zend_parse_parameters php扩展程序的参数传递 扩展类传参数

在php扩展程序的开发中,涉及参数接受处理时,第一步便是要对传入参数进行判断,如生成的扩展示例代码: if (zend_parse_parameters(ZEND_NUM_ARGS(), “s”, &arg, &arg_len) == FAILURE) { return; }如上述示例代码,其判断有 1:判断是否有入参,如果没有入参就会报缺少参数错误。 2:判断入参是不是字符串,如果不是字符串就会把参数类型错误。 先说一下参数类型吧,上面的例子中只有字符串,没有其它类型。实际PHP扩展程序中的类型不少,有整型,浮点型,还有zval类型。zval是Zend引擎的值容器,无论这个变量是个简单的布尔值,字符串或者其他任何类型值,其信息总是一个完整的zval结构。可以认为是一个简单数据的底层复杂描述的结构。

PHP_FUNCTION(kermitcal) {   
char *username;
size_t username_len;
char *age;
size_t age_len;
char *email = "admin@04007.cn";
size_t email_len = sizeof("admin@04007.cn") -1;
zend_string *strg;
#使用sl|s表示|后的这个email参数可以不传递,使用默认值。
if (zend_parse_parameters(ZEND_NUM_ARGS(), "sl|s",&username, &username_len,&age, &age_len, &email, &email_len) == FAILURE){
    php_printf("need params username(string) and age(int).!");
    RETURN_NULL();
}
strg = strpprintf(0, "大家好,我叫%s, 今年%d岁, 我的邮箱是:%s \n", username, age, email);
RETURN_STR(strg); }
阅读全文

spl_autoload_register

为什么要用spl_autoload_register其实我觉得这一段话基本可以解决所有的问题

阅读全文

gdb 调试学习yaf 源码

$gdb php (gdb) run index.php Starting program: /usr/local/bin/php index.php Unable to find Mach task port for process-id 96064: (os/kern) failure (0x5). (please check gdb is codesigned - see taskgated(8))

$sudo gdb php Password: GNU gdb (GDB) 8.0 (gdb) run index.php Starting program: /usr/local/bin/php index.php

阅读全文

php扩展实现一个class

$./ext_skel –extname=myClass Creating directory myClass Creating basic files: config.m4 config.w32 .gitignore myClass.c php_myClass.h CREDITS EXPERIMENTAL tests/001.phpt myClass.php [done].

阅读全文

PHP_MINIT

1 PHP_MINIT 宏 首先是宏展开 PHP_MINIT(moule) 等价于 zm_startup_moule 具体的宏替换如下

阅读全文

PHP-Yaf执行流程-源码分析

在application目录下有个Bootstrap.php文件,这个就是图中的第一个环节,如果存在Bootstrap()就会先执行该文件,该文件包含了一系列的初始化环节,并返回一个Yaf_Application对象,紧接着调用了它的run方法,run里面包含了图中所有环节,run首先是调用路由,路由的主要目的其实就是找到controllers文件,然后执行里面的init和action方法,或者找到所有actions的地址然后加载,在去执行对应的execute方法,如果设置了autoRender在返回的时候会执行render方法,就是view自动渲染,图中有六个双横线标出的环节,就是六个插件方法,用户可以自定义实现这几个方法,然后Yaf框架会在图中相应的步骤处调用对应的HOOK方法。 https://www.jianshu.com/p/130389235abc

阅读全文

Semantic Versioning

Summary Given a version number MAJOR.MINOR.PATCH, increment the:

阅读全文

preload php预加载

php.ini

阅读全文

file_get_contents

PHP中file() 函数和file_get_contents() 函数的作用都是将整个文件读入某个介质,其主要区别就在于这个介质的不同。file() 函数是将文件读入一个数组中,而file_get_contents()是将文件读入一个字符串中。

阅读全文

auto_prepend_file与auto_append_file使用方法

auto_prepend_file与auto_append_file使用方法

阅读全文

php执行shell命令,system、exec、passthru

一、命令

阅读全文

symfony/console composer

https://github.com/symfony/symfony

阅读全文

phptrace Molten

Molten可以认为是phptrace的的升级版,增加了可视化分布式等等等等的功能吧,主要用了phptrace的信息收集这块。

阅读全文

object 传引用

PHP 的引用是别名,就是两个不同的变量名字指向相同的内容。在 PHP 5,一个对象变量已经不再保存整个对象的值。只是保存一个标识符来访问真正的对象内容。 当对象作为参数传递,作为结果返回,或者赋值给另外一个变量,另外一个变量跟原来的不是引用的关系,只是他们都保存着同一个标识符的拷贝,这个标识符指向同一个对象的真正内容。

阅读全文

composer dump-autoload

composer 提供的 autoload 机制使得我们组织代码和引入新类库非常方便,但是也使项目的性能下降了不少 。

阅读全文

composer 的自动加载原理

PHP 自5.3的版本之后,已经重焕新生,命名空间、性状(trait)、闭包、接口、PSR 规范、以及 composer 的出现已经让 PHP 变成了一门现代化的脚本语言。PHP 的生态系统也一直在演进,而 composer 的出现更是彻底的改变了以往构建 PHP 应用的方式,我们可以根据 PHP 的应用需求混合搭配最合适的 PHP 组件。当然这也得益于 PSR 规范的提出。

阅读全文

thrift 关键字冲突

错误 File “/private/tmp/pycodegen/thriftpy/parser/lexer.py”, line 258, in t_IDENTIFIER ‘ at line %d’ % (t.value, t.lineno)) thriftpy.parser.exc.ThriftLexerError: Cannot use reserved language keyword: ‘from’ at line 82

阅读全文

yaf_cg 生成yaf框架

https://github.com/laruence/yaf

阅读全文

yaf 加载机制

前面两篇博客分别讲述了PHP自带的类加载和composer中类的自动加载,其实Yaf框架也实现了基于PSR0和PSR4的类的自动加载。根据我对Yaf下类的自动加载方式的理解写下这篇博客。由于接触Yaf框架时间不长,因此如果有不对之处,还望大家不吝指教。

阅读全文

register_globals

可能 PHP 中最具争议的变化就是从 PHP » 4.2.0 版开始配置文件中 PHP 指令 register_globals 的默认值从 on 改为 off 了。对此选项的依赖是如此普遍以至于很多人根本不知道它的存在而以为 PHP 本来就是这么工作的。本节会解释用这个指令如何写出不安全的代码,但要知道这个指令本身没有不安全的地方,误用才会。

阅读全文

php phar原理

PHAR (“Php ARchive”) 是PHP里类似于JAR的一种打包文件。如果你使用的是 PHP 5.3 或更高版本,那么Phar后缀文件是默认开启支持的,你不需要任何其他的安装就可以使用它。

阅读全文

php单引号比双引号高效

PHP 引擎允许使用单引号和双引号来封装字符串变量,但是它们的速度是有很大的差别的!

阅读全文

将PHP程序打包成可执行的phar文件

phpunit的做法是把所有相关文件打包封装到一个phar包里去分发,我也可以这么干。

阅读全文

用phar-composer来构建基于composer的phar包

phar.readonly=off 本文成功执行的前提依然是php.ini中的phar.readonly=off。

阅读全文

openssl 扩展安装不正确导致https请求 segmentfault

$composer global require xx -vvv Changed current directory to /Users/didi/.composer Loading config file /Users/didi/.composer/config.json Loading config file /Users/didi/.composer/auth.json Reading /Users/didi/.composer/composer.json Loading config file /Users/didi/.composer/config.json Loading config file /Users/didi/.composer/auth.json Loading config file /Users/didi/.composer/composer.json Loading config file /Users/didi/.composer/auth.json Reading /Users/didi/.composer/auth.json Segmentation fault: 11

阅读全文

mysql_real_escape_string

mysql_real_escape_string — 转义 SQL 语句中使用的字符串中的特殊字符,并考虑到连接的当前字符集

阅读全文

magic_quotes_gpc

php中的magic_quotes_gpc是配置在php.ini中的,他的作用类似addslashes(),就是对输入的字符创中的字符进行转义处理。他可以对$_POST、$__GET以及进行数据库操作的sql进行转义处理,防止sql注入。

阅读全文

log_errors display_errors

display_errors,开启log_errors,配置error_log路径 1)display_error

阅读全文

int 比 intval 性能高出3至6倍

OPCODE 进行了分析,解释了其深层原因

阅读全文

extract eval

@extract($a); //extract() 函数从数组中把变量导入到当前的符号表中

阅读全文

expose_php

https://manual.phpdoc.org/ expose_php boolean 决定是否暴露 PHP 被安装在服务器上(例如在 Web 服务器的信息头中加上其签名:X-Powered-By: PHP/5.3.7)。 The PHP logo guids are also exposed, thus appending them to the URL of a PHP enabled site will display the appropriate logo (e.g., » https://www.php.net/?=PHPE9568F34-D428-11d2-A769-00AA001ACF42). This also affects the output of phpinfo(), as when disabled, the PHP logo and credits information will not be displayed. https://www.php.net/manual/zh/ini.core.php 一、如何触发PHP彩蛋? 我们只要在运行PHP的服务器上,在域名后面输入下面的字符参数,就能返回一些意想不到的信息。当然有些服务器是把菜单屏蔽了的。彩蛋只有这4个,PHP是开放源代码的,所以不必担心还有其他。

阅读全文

escapeshellarg

(PHP 4 >= 4.0.3, PHP 5, PHP 7)

阅读全文

composer svn

mac上用composer 全局安装工具时报错 [Symfony\Component\Process\Exception\RuntimeException] The process has been signaled with signal “5”.

方法一:重新安装svn

阅读全文

composer autoload

$composer global require xxx Changed current directory to /Users/didi/.composer You are running Composer with SSL/TLS protection disabled. ./composer.json is not readable.

阅读全文

assert_instances_of instances_of

$this->assertInstanceOf(User::class, $user); $this->assertInstanceOf(get_class($expectedObject), $user);

阅读全文

foreach

php定义空对象 有时候我们直接对不存在的数组直接定义其下标的值,不会报错,但是我们定义不存在的对象的时候,就会报错,这个时候我们定义一个空对象即可.有以下三种方法:

阅读全文

yaf

https://github.com/laruence/yaf https://github.com/laruence/yaf-examples

阅读全文

proto

https://colobu.com/2015/01/07/Protobuf-language-guide/

阅读全文

openssl_x509_parse

https://www.php.net/manual/en/function.openssl-x509-parse.php

阅读全文

openssl 版本过高导致php7.0 安装openssl 失败

/Users/cpm/Downloads/packages/php-5.4.45/ext/openssl/openssl.c:1433:15: error: incomplete definition of type ‘struct X509_extension_st’ p = extension->value->data; ~~~~~~~~~^ /Users/cpm/Downloads/packages/php-5.4.45/ext/openssl/openssl.c:1434:20: error: incomplete definition of type ‘struct X509_extension_st’ length = extension->value->length; $ curl -O https://www.openssl.org/source/old/1.0.2/openssl-1.0.2u.tar.gz $ tar xf openssl-1.0.2u.tar.gz $ cd openssl-1.0.2u $ ./Configure darwin64-x86_64-cc –prefix=/opt/openssl-1.0.2u $ make $ sudo make install

阅读全文

CaBundle openssl 内存泄露问题

mmap() failed: [12] Cannot allocate memory PHP Fatal error: Out of memory (allocated 81788928) (tried to allocate 14987979559889010744 bytes) in phar:///usr/local/bin/composer/vendor/composer/ca-bundle/src/CaBundle.php on line 167

阅读全文

php-src 安装遇到问题

$./configure -bash: ./configure: No such file or directory

阅读全文

openssl 安装坑

Cannot find config.m4. Make sure that you run ‘/opt/local/bin/phpize’ in the top level source directory of the module

阅读全文

composer

[ErrorException] file_put_contents(/Users/didi/.composer/cache/repo/http—artifactory./packages.json): failed to open stream: No such file or directory sudo chown -R $USER ~/.composer/ https://stackoverflow.com/questions/41212362/composer-file-put-contents-composer-json-failed-to-open-stream-permission?rq=1

阅读全文

GPBMetadata DescriptorPool

DescriptorPool 任何时候想要查询一个Descriptor , 都是去DescriptorPool里面查询。 DescriptorPool 实现了这样的机制 :

阅读全文

stubs

https://blog.jetbrains.com/phpstorm/2018/03/how-to-provide-stubs-for-phpstorm/ https://github.com/JetBrains/phpstorm-stubs/blob/master/standard/_types.php https://github.com/JetBrains/phpstorm-stubs

阅读全文

升级到php8 问题

运行composer preg_match(): Allocation of JIT memory failed, PCRE JIT will be disabled.

阅读全文

xmi

phpuml ~/PhpstormProjects/php/ -f html -o ./uml/

phpuml ~/PhpstormProjects/php/ -o ./uml/ https://www.laruence.com/2010/05/14/1473.html Visio2007不支持导入XMI, 我找到了另外的一个工具:Altova Umodel, 没有mac版本

阅读全文

php_uml

https://pear.php.net/package/PHP_UML/download 自动生成UML图的方法. 下载:http://pear.php.net/package/PHP_UML 假设, 我有一个项目文件夹:laruence, 在这个文件夹上有一个文件Root.php(事实上, 无论多级目录, 多个文件, 都可以).

阅读全文

phpCallGraph

phpCallGraph is a tool to generate static call graphs for PHP source code.

阅读全文

jit

PHP 8 的 JIT(Just In Time)编译器将作为扩展集成到 php 中 Opcache 扩展 用于运行时将某些操作码直接转换为从 cpu 指令。

阅读全文

dynasm

https://luajit.org/dynasm.html

阅读全文

mac php8 源码安装 扩展编译

./configure –enable-debug –enable-phpdbg make make install

阅读全文

zend_config

./configure –with-php-config=/usr/local/bin/php-config ./configure –enable-debug

阅读全文

zend_extension

http://blog.mallol.cn/2018/31c7372c.html http://yangxikun.github.io/php/2016/07/10/php-zend-extension.html 根据 PHP 版本,zend_extension 指令可以是以下之一:

阅读全文

zend ZEND_OPCODE_HANDLER_ARGS_PASSTHRU

https://wiki.php.net/internals/extensions opcode 对应函数执行代码 if (UNEXPECTED((ret = ((opcode_handler_t)OPLINE->handler)(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)) != 0)) { hook 方法: 1,用函数简单包裹这一行 2,在扩展中mdoudule_init 里替换这个函数,做hook或者探针逻辑 数组的值存储在zvalue_value.ht字段中,ht是一个HashTable的数据 在Zend/zend_vm_execute.h文件中

阅读全文

Xdebug

2 下载xdebug

阅读全文

getopt-php

https://github.com/getopt-php/getopt-php https://www.php.net/manual/zh/function.getopt.php php中的getop是用于接收cmd参数的时候用的 例如当你再linxu 中 需要用php调试的时候,往往需要带参数调试 getopt就是可以实现带参数传入的命令

阅读全文

php graphviz 可视化工具

PEAR(扩展与应用库:PHP Extension and Application Repository),是PHP官方开源类库,可以使用pear list列出所有已经安装的包。通过pear install可以安装需要的包。

阅读全文

scripts

composer update 报 composer clearcache sh: composer: command not found Script composer clearcache handling the pre-update-cmd event returned with error code 127 干掉这一行,问题解决 “scripts”: { “pre-update-cmd”: “composer clearcache”, } Could you post your entire composer.json file ?

阅读全文

zend_string_init

char * 转zend_string zend_string_init

阅读全文

strlen core 原因排查

$composer update Segmentation fault: 11

阅读全文

execute_data

1.EG(executor_globals/zend_executor_globals)

阅读全文

debug_backtrace

Zend/zend_buildin_functions.c +2600 ZEND_FUNCTION(debug_backtrace)

阅读全文

php 500 错误排查

php检测php.ini是否配制正确 运行命令行

阅读全文

cgi

CGI:即通用网关接口,是一种协议,定义了web服务器和应用程序交互数据的基本格式。例如一个请求发送到nginx后,nginx应该按照CGI协议将请求按照规定的格式处理好后(标准的请求头信息,查询字符串,请求路径等等),然后启用相应的应用程序解析器(php就是php解释器,python就是python解释器),然后把数据传输给解析器,这个时候解析器就可以定位到我们编写的处理代码对请求进行处理,处理完以后按照CGI协议规定的数据格式将结果返回给web服务器,最后退出进程。 fastcgi:fastcgi可以看作是cgi协议的改良版,cgi是通过启用一个解释器进程来处理每个请求,耗时且耗资源,而fastcgi则是通过master-woker形式来处理每个请求,即启动一个master主进程,然后根据配置启动几个worker进程,当请求进来时,master从worker进程中选择一个去处理请求,这样就避免了重复的开启和结束进程带来频繁cpu上下文切换而导致耗时。所以fastcgi也是一种规定了如何实现web服务器和应用程序通信的协议,但是比cgi协议更先进。 通过cgi实现 用户请求http://www.baidu.com?key=码农&platform=linux。 省略一系列DNS解析然后将数据传输到nginx监听的端口上。 nginx根据配置文件判断该请求是否是静态文件,是的话直接从文件系统读取返回给浏览器。不是的话将接收到的数据进行处理(按照CGI或者fastcgi协议规定的格式),提取出请求头,请求参数,资源路径等信息。 nginx通过配置文件启动一个cgi程序,例如php_cgi,由于php_cgi程序是实现了cgi协议的,所以它能够识别出nginx传过来的数据,然后去执行相应的php文件。 php_cgi将执行后的结果返回给nginx,然后进程退出。 nginx将获得的结果按照http协议规范处理后返回给浏览器。 通过fastcgi实现 Web Server启动时载入FastCGI进程管理器(IIS ISAPI,Apache Module或者php-fpm) FastCGI进程管理器自身初始化,启动多个CGI解释器进程(多个php-cgi)并等待WebServer的连接。 当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。 Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。 FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在Web Server中)的下一个连接。

阅读全文

PHP7源码之CG EG SG PG宏

CG的含义是 compiler_globals。Zend编译器相关的全局变量。 EG的含义是 executor_globals。Zend执行器相关的全局变量。 EG和CG有一些数据是共用的。如,function_table (存储方法信息) , class_table (存储类信息) 。

阅读全文

trait 优先级

1、先声明一个trait; 2、在类中使用use将该trait引入。

阅读全文

apcu_add

https://www.php.net/manual/zh/function.apcu-add.php

阅读全文

phpunit.xml

https://stackoverflow.com/questions/1885887/phpunit-xml-file-phpunit-xml 可以在项目根目录添加 phpunit.xml 或 phpunit.xml.dist (按此顺序读取)来配置PHPunit。 此记录的phpunit版本5.6.x.

元素的属性用于配置 PHPUnit 的核心功能。 http://www.yzone.net/blog/130 https://cloud.tencent.com/developer/article/1481484
阅读全文

跑通一个单元测试

单元测试testCase一般是放在项目根目录的tests目录下,可以建子目录对应一个模块,每一个test文件对应一个具体功能的单元测试点,然后在项目根目录建个phpunit.xml.dist来编排测试套件,测试时只用在phpunit.xml.dist所在目录运行phpunit命令即可。这里用composer主要用它的autoload。

阅读全文

phytrix

About Phystrix 在具有PHP前端的分布式系统中,应用程序与许多远程服务进行通信。无论是您自己的一组服务,第三方RESTful API还是需要网络交互的传统组件:在复杂的高负载系统中,偶尔的故障是无法避免的。Phystrix通过跟踪各种指标并防止重复性故障来保护对远程资源的访问点。如果服务失败的情况太频繁,为了不使情况更糟,Phystrix将暂时停止向它发出请求。当服务恢复生机时,Phystrix允许客户端应用程序再次访问它。

阅读全文

phpunit

https://github.com/sebastianbergmann/phpunit-documentation

阅读全文

PHPUnit_Framework_TestCase

namespace PHPUnit\Framework;

阅读全文

valgrind

1,编译php的时候,必须要带上–enable-debug选项。

阅读全文

phpdbg gdb

查看opcode php是先把源码解析成opcode,然后再把opcode传递给zend_vm进行执行的。

阅读全文

gdb 调试动态链接库

gdb) file <你的exe> (gdb) load <你的so> #这条应该是可选的

阅读全文

current_execute_data

  1. Zend引擎主要包含两个核心部分:编译、执行:
阅读全文

valgrind

Valgrind 是许多 Unix 环境下使用的知名工具,可以在任何 C/C++ 编写的软件中调试许多常见的内存问题。 Valgrind 是有关内存调试的多功能前端工具。最常用的底层工具称为 “memcheck”。它的工作方式是用自己的堆分配替换每个 libc 的堆分配,并跟踪你对它们所做的事情。你可能还会对 “massif” 感兴趣:它是一个内存跟踪器,对于了解程序的常规堆内存使用情况非常有用。

阅读全文

strlen

https://blog.csdn.net/u013474436/article/details/53309028?utm_source=blogxgwz1 https://stackoverflow.com/questions/35006614/what-does-symbol-not-found-expected-in-flat-namespace-actually-mean https://stackoverflow.com/questions/18809986/undefined-reference-to-strnlen-s-strncpy-s-strncat-s https://www.hongweipeng.com/index.php/archives/1014/ strlen_s 是微软的库,mac不能用

阅读全文

gdb调试 php

(gdb) run testmyFile.php Starting program: /usr/local/bin/php testmyFile.php Unable to find Mach task port for process-id 22822: (os/kern) failure (0x5). (please check gdb is codesigned - see taskgated(8))

$sudo gdb php 这是因为 Darwin 内核在你没有特殊权限的情况下,不允许调试其它进程。调试某个进程,意味着你对这个进程有完全的控制权限,所以为了防止被恶意利用,它是默认禁止的。允许 gdb 控制其它进程最好的方法就是用系统信任的证书对它进行签名。 问题解决 https://segmentfault.com/q/1010000004136334

阅读全文

zend_string char

zend_string 和char*不是一个东西,因此转换的时候特别注意 写扩展的时候遇到了一个bug 明明写进去了 add_assoc_long(MYFILE_G(my_func_set), func_name, timeElipsed); 但是取出来一直是0 zval* lastVal = zend_hash_find(Z_ARRVAL_P(MYFILE_G(my_func_set)),key); 排查发现key的类型不对 写进去是char* 取出来却是zend_string一定要注意

阅读全文

usr2

nginx和php-fpm的进程启停重载总结 nginx和php-fpm对于-USR2、-HUP信号的处理方式不一样: TERM, INT(快速退出,当前的请求不执行完成就退出) QUIT (优雅退出,执行完当前的请求后退出) HUP (重新加载配置文件,用新的配置文件启动新worker进程,并优雅的关闭旧的worker进程, 用于nginx的加载新配置,不能用于php-fpm加载新配置) USR1 (重新打开日志文件) USR2 (平滑的升级nginx二进制文件/平滑加载php-fpm新配置) WINCH (优雅的关闭worker进程) php-fpm #关闭 kill -QUIT $php_fpm_pid

阅读全文

sub_array

当你在扩展中使用 HashTable 时候,大部分情况下是要存储用户端的变量,就像 PHP 语言中数组那样。为此,内核中已经准备好了相应的工具,来让我们更加的方便的操作 HashTable 存储 zval*,也就是 PHP 语言中的数组,即 IS_ARRAY 常量代表的 zval,以下用 {数组} 来代替 PHP 语言中的数组这个词。

阅读全文

扩展回调php函数

在PHP扩展里是通过 call_user_function_ex 函数来调用用户空间的函数的。

阅读全文

stacktrace

https://github.com/rbspy/rbspy https://github.com/oraoto/php-stacktrace php-stacktrace: PHP进程外查看函数调用堆栈

阅读全文

execute_data

php的op_array与execute_data的关系 php分为几个阶段包括生成opcode阶段和执行opcode阶段,其实分别对应的就是上面两个数据结构, 并且两个数据结构都是在解析到新的函数时分配新的空间,然后层层嵌套,最外层总是有个大的op_array与execute_data,具体点说就是这两个数据结构存储的是当前函数下的变量环境。 然后就是上面两个不同阶段存储该阶段应该存储的数据,然后可供下一层调用。 http://www.voidcn.com/article/p-qjlxtflt-mc.html

阅读全文

call_user_function

扩展可能需要调用用户自定义的函数或者其他扩展定义的内部函数,PHP提供的函数调用API的使用:

阅读全文

ZEND_HASH_FOREACH_KEY_VAL php扩展hashtable操作

php7的遍历数组和php5差很多,7提供了一些专门的宏来遍历元素(或keys)。宏的第一个参数是HashTable,其他的变量被分配到每一步迭代:

阅读全文

zval 替代char 解决返回字符串内存泄漏问题

接收参数 不像在用户空间的代码那样,一个内部函数的参数实际上不会声明在函数的头部。相反,参数列表的引用会传递到每个函数中 – 不管参数传递了没有 – 接下来函数就可以让Zend Engine把这些参数变成可以使用的变量。

阅读全文

zend_mm_heap corrupted

PHP7+Swoole开启opcache,运行时出现zend_mm_heap corrupted。这个问题的主要原因是PHP7增加了一个优化项,如果PHP代码中一个数组只声明一次,并且没有对数据进行修改操作。PHP7会将此数组转为immutable类型,此数组仅作为只读。

阅读全文

PHP7扩展开发之数组处理

这次,我们将演示如何在PHP扩展中如何对数组进行处理。要实现的PHP代码如下:

阅读全文

ZEND_HASH_FOREACH_KEY_VAL

1、zend_hash_num_elements 获取数组元素个数。宏定义如下: 1 #define zend_hash_num_elements(ht)
2 (ht)->nNumOfElements 2、ZEND_HASH_FOREACH_KEY_VAL 遍历数组键值。使用方法: 1 ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(array), num_key, string_key, entry) { 2 // code 3 } ZEND_HASH_FOREACH_END();  ZEND_HASH_FOREACH_KEY_VAL是个宏函数: 1 #define ZEND_HASH_FOREACH_KEY_VAL(ht, _h, _key, _val)
2 ZEND_HASH_FOREACH(ht, 0);
3 _h = _p->h;
4 _key = _p->key;
5 _val = _z;   继续展开 ZEND_HASH_FOREACH:

阅读全文

PHP 调试技巧 扩展调试

https://www.zhihu.com/question/20348619/answer/101893104

阅读全文

PHP 接口调用报错 502 Bad Gateway

PHP接口调用超过5s的请求直接返回如下信息:

阅读全文

zend_execute_ex

解释器引擎最终执行op的函数是zend_execute,实际上zend_execute是一个函数指针,在引擎初始化的时候zend_execute默认指向了execute,这个execute定义在{PHPSRC}/Zend/zend_vm_execute.h

阅读全文

zend_execute_data

研究下PHP Generator的实现,发现对于Generator很重要的一个数据结构为_zend_execute_data,在PHP源码中通常是一个execute_data变量,与该变量相关的宏是#define EX(element) execute_data.element。

阅读全文

PHP打印调用堆栈的三种方法

一、debug_print_backtrace()

阅读全文

php7 基础上编译扩展,hack文件操作

https://www.laruence.com/2009/04/28/719.html

阅读全文

extension php扩展和zend扩展区别

myFile.so doesn’t appear to be a valid Zend extension 原因 vi /home/xiaoju/php7/etc/php.ini 把 zend_extension=myFile.so 改成 extension=myFile.so

阅读全文

yaf

https://www.laruence.com/manual/yaf.infos.html#yaf.differences

阅读全文

phpt 是php源码的测试文件

http://qa.php.net/write-test.php phpt文件用于PHP的自动化测试,这是PHP用自己来测试自己的测试数据用例文件。测试脚本通过执行PHP源码根目录下的run-tests.php,读取phpt文件执行测试。 phpt文件包含 TEST,FILE,EXPECT 等多个段落的文件。在各个段落中,TEST、FILE、EXPECT是基本的段落,每个测试脚本都必须至少包括这三个段落。其中:

阅读全文

php 扩展编写ext

cd /Users/didi/PhpstormProjects/c/php-src $git checkout -b xiazemin/function_record

阅读全文

PHP严格模式 Strict standards

Declaration of xxxxxx should be compatible with yyyyyy 警告规则 (如):Strict standards: Declaration of xxxxxx should be compatible with yyyyyy

阅读全文

解决mac 没有php.ini 文件问题

php -v PHP 7.2.0-dev (cli) (built: May 20 2020 23:46:30) ( NTS DEBUG ) Copyright (c) 1997-2016 The PHP Group

阅读全文

composer replace

原始解释: “Lists packages that are replaced by this package. This allows you to fork a package, publish it under a different name with its own version numbers, while packages requiring the original package continue to work with your fork because it replaces the original package.”

阅读全文

composer openssl extension is required

错误提示 The openssl extension is required for SSL/TLS protection but is not availab le. If you can not enable the openssl extension, you can disable this error , at your own risk, by setting the ‘disable-tls’ option to true. ta errorRet

阅读全文

xdebug

$ pecl install xdebug WARNING: channel “pecl.php.net” has updated its protocols, use “pecl channel-update pecl.php.net” to update pecl/xdebug requires PHP (version >= 7.1.0), installed version is 7.0.6 No valid packages found install failed

阅读全文

xdebug 配置教程

https://my.oschina.net/botkenni/blog/979090 环境:

阅读全文

apcu

APCu 是老牌 PHP 字节码和对象缓存 缓存器 APC 的分支,具体由来还得讲个故事。

阅读全文

PHP SPL(PHP 标准库)

一、什么是spl库? SPL是用于解决典型问题(standard problems)的一组接口与类的集合。

阅读全文

composer

执行 composer update 命令的时候报 Your requirements could not be resolved to an installable set of packages. 错误 Your requirements could not be resolved to an installable set of packages.

阅读全文

stream_set_timeout

PHP函数stream_set_timeout(Stream Functions)作用于读取流时的时间控制。fsockopen函数的timeout只管创建连接时的超时,对于连接后读取流时的超时,则需要用到 stream_set_timeout函数。由于国内的网络环境不是很稳定,尤其是连接国外的时候,不想程序出现Fatal error: Maximum execution time of 30 seconds exceeded in …的错误,该函数尤其有用。stream_set_timeout需配合stream_get_meta_data使用,如果没有timeout, stream_get_meta_data返回数组中time_out为空,反之为1,可根据此判断是否超时。另外由于PHP默认的Maximum execution time为30秒,这是一次执行周期的时间,为了不出现上述的Fatal error,还需要设置一个总的读取流的时间 $server=”www.yahoo.com”;
$port = 80;

$data=”GET / HTTP/1.0rn”;
$data.=”Connection: Closern”;
$data.=”User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)rnrn”;

$start_time = time();
$fp=fsockopen($server, $port, $errno, $errstr, 5);
if (!$fp) {
die(“Connect Timeout.n”);
} else {
stream_set_blocking($fp, True);
stream_set_timeout($fp, 3);

fputs($fp, “$data”);
while (!feof($fp)) {
$text .= fread($fp, 2000);

$diff = time() - $start_time;
if ($diff > 24) {
die(“Timeout!n”);
}

$status = stream_get_meta_data($fp);
if ($status[’timed_out’]) {
die(“Stream Timeout!n”);
}
}
}

fclose($fp);

阅读全文

__destruct与register_shutdown_function执行的先后顺序

根据php手册的解析。

阅读全文

enable_file_override

opcache.enable_file_override boolean

阅读全文

composer source 和 dist。

下载包的方式有两种: source 和 dist。

阅读全文

composer

–profile: 显示时间和内存使用信息。

阅读全文

prestissimo Composer 加速

https://github.com/hirak/prestissimo https://zhuanlan.zhihu.com/p/64419387 它的作用就是在安装拓展的时候提升 Composer 的安装速度,其原理是使用多进程下载的方式来解决。我体验了一下,真的是爽到不行。它的安装也是非常简单。

阅读全文

packagist composer

composer是现代PHP的基石 现代高级编程语言,依赖管理工具是必不可少的。Java有Maven,Python有pip,Nodejs有npm, 而在composer出现之前,PHP只有被广为诟病的Pear, 由于Pear实在太难用,很少PHP开发者用到这个工具。以致于PHP的开发生态很糟糕。

阅读全文

fpm slowlog

当nginx收到如上错误码时,可以确定后端php-fpm解析php出了某种问题,比如,执行错误,执行超时。

阅读全文

php execute_ex

php扩展实践zend_execute_ex层获取实参 其实在实现的 php 函数里面是很容易获取到的,参考 php 的 builtin 函数 func_get_args() 就可以知道了。 void **p; int arg_count; int i; zend_execute_data *ex = EG(current_execute_data);

阅读全文

php Traits

在计算机编程中,Traits是面向对象编程中使用的一种概念,它表示一组可用于扩展类功能的方法

阅读全文

php-Parser

PHP-Parser是一款PHP源代码分析器,可以将PHP源代码解析为抽象语法树(AST)。 项目主页是https://github.com/nikic/PHP-Parser。

阅读全文

PhpStorm Xdebug远程调试环境搭建原理分析

http://xxlegend.com/2017/05/23/PhpStorm%20Xdebug%E8%BF%9C%E7%A8%8B%E8%B0%83%E8%AF%95%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA%E5%8E%9F%E7%90%86%E5%88%86%E6%9E%90%E5%8F%8A%E9%97%AE%E9%A2%98%E6%8E%92%E6%9F%A5/ 1,环境介绍 本地:windows7(192.168..)+ phpstorm8 远程:Ubuntu14.04(192.168.3.206)+ apache2 + php5

阅读全文

file_get_contents

1: 用file_get_contents 以get方式获取内容

阅读全文

php heredoc

PHP EOF(heredoc)是一种在命令行shell(如sh、csh、ksh、bash、PowerShell和zsh)和程序语言(像Perl、PHP、Python和Ruby)里定义一个字符串的方法。 使用概述:

阅读全文

xdebug

https://xdebug.org/ Xdebug is an extension for PHP to assist with debugging and development. It contains a single step debugger to use with IDEs; it upgrades PHP’s var_dump() function; it adds stack traces for Notices, Warnings, Errors and Exceptions; it features functionality for recording every function call and variable assignment to disk; it contains a profiler; and it provides code coverage functionality for use with PHPUnit. Xdebug作为PHP的代码调试工具,提供了丰富的调试函数,也可将其配置为zend studio、editplus、phpstorm等IDE的第三方调试插件。通过开启Xdebug的自动跟踪(auto_trace)和分析器功能,更可以直观察PHP源代码的性能数据,从而优化PHP代码。 右边机器(IP=10.0.1.2)是布署了Nginx/php的服务端(下文简称php服务端),左侧机器(IP=10.0.1.42)是布署了IDE(比如Phpstorm)的IDE端(下文简称IDE端)。 调试中基本通信过程说明:

阅读全文

php7

https://www.php.net/manual/zh/migration53.new-features.php 相对于老版本的 5.x 来说,PHP 7.4 非常新,并且增加了很多令人惊喜的 新特性 。由于底层引擎大部分被重写了,现在新版本的 PHP 比老版本运行得更快。

阅读全文

max_execution_time fpm

一个线上服务nginx请求日志里突然出现大量499、500、502的错误,于此同时发现php-fpm的worker进程不断的退出,新启动的worker几乎过几十秒就死掉了,在php-fpm.log里发现如下错误:

阅读全文

swagger php

在php文件中写 swagger 格式的 /* 注释 / 用 swagger-php 内的 bin/swagger.phar 命令扫描 php controller 所在目录, 生成 swagger.json 文件 将 swagger.json 文件拷贝到 swagger-ui 中 index.html 指定的目录中 打开 swagger-ui 所在的 url, 就可以看到文档了. 文档中的各个 api 可以在该网址上直接访问得到数据. 实现此需求只需要 swagger 的如下两个项目: swagger-php: 扫描 php 注释的工具. 内含一个不错的例子. swagger-ui: 用以将扫描工具生成的 swagger.json 文件内容展示在网页上. $ git clone https://github.com/swagger-api/swagger-ui.git $ git clone https://github.com/zircote/swagger-php.git

阅读全文

http状态码413

通过post上传文件过大时,会出现413错误码;前端打开开发者模式,在输出台的位置会出现:

阅读全文

phpgc

以前的 php 用到的引用计数内存机制,无法处理循环的引用内存泄漏。然而 5.3.0 PHP 使用文章» 引用计数系统中的同步周期回收(Concurrent Cycle Collection in Reference Counted Systems)中的同步算法,来处理这个内存泄漏问题。

阅读全文

fpm_scoreboard

fpm_scoreboard(以下简称scoreboard模块)是PHP-FPM核心功能之一,源码位于sapi/fpm/fpm_scoreboard.c。从字面意思理解是一个”记分器”,实际上,是FPM内置的一个worker进程统计功能模块。 scoreboard模块定义fpm_scoreboard_s和fpm_scoreboard_proc_s两种数据结构。

阅读全文

php

php -r ‘function a($a){ echo $a;} a(1,2,3);’ 不会报错,因为php允许传参数比声明的多 定义参数默认值 可以实现如果某个参数不传进来,那这个参数就默认为某个值这样

阅读全文

fastcgi_client

CGI全称是“通用网关接口”(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序一般运行在网络服务器上。 CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。如php,perl,tcl等。

阅读全文

RequestID fastcgi

为什么需要在消息头发送 RequestID 这个标识? 如果是每个连接仅处理一个请求,发送 RequestID 则略显多余。

阅读全文

phpcs phpcbf PHP_CodeSniffer

PHP_CodeSniffer 是一个代码风格检测工具。它包含两类脚本,phpcs 和 phpcbf(GitHub 地址)。

阅读全文

socketpair nginx 通信机制

由于nginx使用的是多进程的模型,因此,进程间的通信或者同步很重要,为什么要进行进程同步呢?我们知道,nginx有master和worker进程。不过,在创建worker进程的时候,是需要对进程同步的。举个具体的例子,我们假设服务器共有4个worker进程,我们知道nginx有一个全局变量,是ngx_processes数组,他存储着所有进程的信息,在worker1创建的时候,worker2,worker3,worker4进程是没有创建的,因此,这个时候就牵扯到同步,最合理的方式是,在master创建一个进程的时候,就应该通知所有子进程有新的进程被fork了,以及这个进程的基本信息。

阅读全文

yaf

https://github.com/elad-yosifon/php-yaf-doc https://github.com/laruence/yaf https://php.net/manual/en/book.yaf.php 下载完成后解压,在解压目录下面只需要依次执行以下几个步骤 :1.phpize 侦测环境(phpize工具是在php安装目录下,基于这点phpize对应了当时的php环境,所以是要根据该php的配置情况生成对应的configure文件),建立一个configure文件。必须在一个目录下去运行phpize。那么phpize就知道你的的环境是哪个目录,并且configure文件建立在该目录下。

阅读全文

ngx_cycle_s

https://www.kancloud.cn/digest/understandingnginx/202596

阅读全文

fpm worker 进程的生命周期

PM(FastCGI 进程管理器)用于替换 PHP FastCGI 的大部分附加功能,对于高负载网站是非常有用的。

阅读全文

ext_skel php-x php扩展开发工具

https://www.php.net/manual/zh/internals2.buildsys.skeleton.php

阅读全文

php-fpm

https://github.com/xiazemin/php7-internal/blob/master/1/fpm.md

阅读全文

limit_rate_after nginx限速配置

Nginx的http核心模块ngx_http_core_module中提供limit_rate这个指令可以用于控制速度,limit_rate_after用于设置http请求传输多少字节后开始限速。 另外两个模块ngx_http_limit_conn_module和ngx_http_limit_req_module分别用于连接数和连接频率的控制。

阅读全文

nginx request_time

1、request_time 官网描述:request processing time in seconds with a milliseconds resolution; time elapsed between the first bytes were read from the client and the log write after the last bytes were sent to the client 。 指的就是从接受用户请求的第一个字节到发送完响应数据的时间,即包括接收请求数据时间、程序响应时间、输出响应数据时间。

2、upstream_response_time 官网描述:keeps times of responses obtained from upstream servers; times are kept in seconds with a milliseconds resolution. Several response times are separated by commas and colons like addresses in the $upstream_addr variable

是指从Nginx向后端(php-cgi)建立连接开始到接受完数据然后关闭连接为止的时间。

从上面的描述可以看出,$request_time肯定大于等于$upstream_response_time,特别是使用POST方式传递参数时,因为Nginx会把request body缓存住,接受完毕后才会把数据一起发给后端。所以如果用户网络较差,或者传递数据较大时,$request_time会比$upstream_response_time大很多。

所以如果使用nginx的accesslog查看php程序中哪些接口比较慢的话,记得在log_format中加入$upstream_response_time。

根据引贴对官网描述的翻译: upstream_response_time:从 Nginx 建立连接 到 接收完数据并关闭连接 request_time:从 接受用户请求的第一个字节 到 发送完响应数据

阅读全文

tideways + xhgui(+toolkit) php 性能分析

https://github.com/tideways/php-xhprof-extension 1)PHP的xhprof扩展Facebook不再进行更新和维护,因为Faceboo已经全面使用HHVM,不再使用PHP zend引擎。 2)xhprof不支持新版本的PHP(PHP7),tideways扩展是从xhprof项目fork下来继续进行维护的,目前支持PHP 7.2, 7.1, 7.0, 5.6 and 5.5 。 3)tideways是开源项目,它收费的只是UI服务,其实 xhgui完全可以满足我们日常的需求 2 功能 tideways是用来测试PHP性能的扩展,它能获取PHP执行的整个过程中调用的函数、调用函数次数、执行时间、CPU时间、内存占用、内存峰值、总执行时间、总CPU时间、总内存占用、总内存峰值等数据,通过以上数据进行分析,找出PHP的性能瓶颈、分析PHP执行过程等。 3 优点 1)tideways是一个PHP扩展,结合xhgui,无需在PHP代码中进行埋点来监控代码 2)可以设置执行频率(例如1/100),无需每个请求都生成执行日志,从而导致性能损失;也可以主动控制是否生成执行日志,通过请求参数来控制(debug=1) 3)有简单直接的UI对数据进行转化 4)可以自由的搭配条件进行数据筛选,例如分析某个特定的接口,分析某个时间段的接口请求情况等 4 缺点 1)虽然是非侵入式的,但是如果对每个接口生成执行日志,那么对CPU和内存的消耗是不可忽略的。 2)如果在线上,header文件万一有错误改动等问题,那么将导致PHP请求无法无法正常运行。

阅读全文

SESSION 保存在服务器的哪里

PHP中的session存储   SESSION 的数据保存在哪里呢?   当然是在服务器端,但不是保存在内存中,而是保存在文件或数据库中。    默认情况下,PHP.ini 中设置的 SESSION 保存方式是 files(session.save_handler = files),即使用读写文件的方式保存 SESSION 数据,而 SESSION 文件保存的目录由 session.save_path 指定,文件名以 sess_ 为前缀,后跟 SESSION ID,如:sess_c72665af28a8b14c0fe11afe3b59b51b。文件中的数据即是序列化之后的 SESSION 数据了。    如果访问量大,可能产生的 SESSION 文件会比较多,这时可以设置分级目录进行 SESSION 文件的保存,效率会提高很多,设置方法为:session.save_path=”N;/save_path”,N 为分级的级数,save_path 为开始目录。    当写入 SESSION 数据的时候,php 会获取到客户端的 SESSION_ID,然后根据这个 SESSION ID 到指定的 SESSION 文件保存目录中找到相应的 SESSION 文件,不存在则创建之,最后将数据序列化之后写入文件【3】。读取 SESSION 数据是也是类似的操作流程,对读出来的数据需要进行解序列化,生成相应的 SESSION 变量 文件存储sessions session.save_handler = files session.save_path = “/var/lib/php/sessions” redis存储sessions 需要先安装php的redis扩展。 编辑/etc/php/7.0/apache2/php.ini 文件。添加这两句 session.save_handler = redis session.save_path = “tcp://127.0.0.1:6379?auth=xxxyyyzzz”

阅读全文

php json_encode 的坑

成功则返回 JSON 编码的 string 或者在失败时返回 FALSE 。 <?php $a=”在水”; $b=substr($a,0,1); var_dump($b); //string(1) “�” var_dump(json_encode($b)); //bool(false) var_dump(json_encode(false)); //string(5) “false” var_dump(json_encode($b,JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)); //bool(false) json_encode的字符串里面包含无法解析的编码,比如URLdecode的转义不完整,比如转义出来的是你好⊙◆?带有乱码,解决办法去除字符串中的乱码或者用正则preg_match_all()把需要的字符串匹配出来,重新进行json_encode

阅读全文

nginx php-fpm unix-socket

tcpdump 无法抓unix socket There’s another way that needs you to find the process id attached to the socket, then find with lsof the file descriptor of the socket and then tap the file descriptor using strace.

阅读全文

cachetool 非php环境操作apcu

https://packagist.org/packages/gordalina/cachetool opcache是个提升php性能的利器,但是在线上服务器真实遇到过偶尔几台服务器代码上线后,一直没有生效,查看opcache的配置也没有问题。后来没有办法,就在上线步骤中增加了重启php-fpm的操作。今天发现了一个小工具cachetool。可以方便的使用命令行清除opcache的缓存。 当然除了重启php-fpm的进程可以清理opcache缓存外,opcache本身是支持清除缓存的。手动清理缓存涉及到的opcache函数主要为:opcache_reset()和opcache_invalidate() 。 但是opcache_reset()是php中的函数,需要在php脚本中执行,另外当PHP以PHP-FPM的方式运行的时候,opcache的缓存是无法通过php命令进行清除的,只能通过http或cgi到php-fpm进程的方式来清除缓存。 如果是unix sock方式也可以 php cachetool.phar opcache:status –fcgi=/var/run/php5-fpm.sock 而opcache_invalidate 废除指定脚本缓存是使指定脚本的字节码缓存失效。可用于明确更新的代码文件列表时使用,但不方便清除整个脚本的缓存。cachetool使用起来也非常方便。如下:

阅读全文

php 内置的 web 服务器

http://php.net/manual/zh/features.commandline.webserver.php 从php5.4开始,引入了一个内置web服务器,可以在测试环境迅速搭建web环境而无须复杂的配置。性能肯定是不如nginx和apache服务器的,生成环境还是要搭建服务器。 命令使用方法: php -S localhost:8000 [-t /var/www/web] 有时候我们需要在同一局域网中的另一台设备中访问这个服务器(例如iPad或本地虚拟机),为此,我们可以把localhost换成0.0.0.0,让PHP Web服务器监听所有接口: php -S 0.0.0.0:8000 要想停止Web服务器,可以关闭终端,也可以按Ctrl+C快捷键。 这个内置的Web服务器不应该用于生产环境,但对于本地开发来说是个极好的工具。Laravel Valet 起初就是使用这个内置的服务器,但是在1.1.0版本后将其替换为Caddy 2、配置 应用常常需要使用专属的PHP配置文件,尤其是对内存使用、文件上传、分析或对字节码缓存有特殊要求时,一定要单独配置,我们可以使用-c选项,让PHP内置的服务器使用指定的配置文件:

阅读全文

php 的定界符 <<

PHP是一个Web编程语言,在编程过程中难免会遇到用echo来输出大段的html和javascript脚本的情况,如果用传统的输出方法 ——按字符串输出的话,肯定要有大量的转义符来对字符串中的引号等特殊字符进行转义,以免出现语法错误。如果是一两处还可以容忍,但是要是一个完整的 html文本或者是一个200行的js我想是谁都会崩溃的。这就是PHP为什么要引入一个定界符的原因——至少一大部分原因是这样的。

阅读全文

php流Streams、包装器wrapper

流Streams这个概念是在php4.3引进的,是对流式数据的抽象,用于统一数据操作,比如文件数据、网络数据、压缩数据等,以使可以共享同一套函数, php的文件系统函数就是这样的共享,比如file_get_contents()函数即可打开本地文件也可以访问url就是这一体现。简单点讲,流就是表现出流式数据行为的资源对象。 以线性方式进行读写,并可以在流里面任意位置进行搜索。 流有点类似数据库抽象层,在数据库抽象层方面,不管使用何种数据库,在抽象层之上都使用相同的方式操作数据, 而流是对数据的抽象,它不管是本地文件还是远程文件还是压缩文件等等,只要来的是流式数据,那么操作方式就是一样的 有了流这个概念就引申出了包装器wrapper这个概念,每个流都对应一种包装器, 流是从统一操作这个角度产生的一个概念,而包装器呢是从理解流数据内容出发产生的一个概念,也就是这个统一的操作方式怎么操作或配置不同的内容; 这些内容都是以流的方式呈现,但内容规则是不一样的,比如http协议传来的数据是流的方式,但只有http包装器才理解http协议传来的数据的意思, 可以这么理解,流就是一根流水的管子,只不过它流出的是数据,包装器就是套在流这根管子外层的一个解释者,它理解流出的数据的意思,并能操作它 官方手册说:“一个包装器是告诉流怎么处理特殊协议或编码的附加代码”明白这句话的意思了吗?

阅读全文

phar

一个php应用程序往往是由多个文件构成的,如果能把他们集中为一个文件来分发和运行是很方便的,这样的列子有很多,比如在window操作系统上面的安装程序、一个jquery库等等,为了做到这点php采用了phar文档文件格式,这个概念源自java的jar,但是在设计时主要针对 PHP 的 Web 环境,与 JAR 归档不同的是Phar 归档可由 PHP 本身处理,因此不需要使用额外的工具来创建或使用,使用php脚本就能创建或提取它。phar是一个合成词,由PHP 和 Archive构成,可以看出它是php归档文件的意思。 关于phar的官网文档请见http://php.net/manual/en/book.phar.php

阅读全文

Php-fpm运行原理

cgi的历史

阅读全文

PHP的Realpath Cache

PHP的缓存有很多种,包括输出缓冲(ob系列函数),opcode缓存(APC,eAccelerator,XCache等扩展实现),这些大家已经很熟悉了,接下来介绍一下一个不太被人注意的PHP缓存机制:realpath_cache。

阅读全文

php_kafka

https://github.com/edenhill/librdkafka https://github.com/arnaud-lb/php-rdkafka https://github.com/weiboad/kafka-php 一、安装以及使用shell命令终端操作kafka 环境配置 1、下载最新版本的kafka: kafka_2.11-1.0.0.tgz http://mirrors.shu.edu.cn/apache/kafka/1.0.0/kafka_2.11-1.0.0.tgz

阅读全文

composer dump-atoload namespace dir

参考:https://docs.phpcomposer.com/04-schema.html

阅读全文

nginx_header

ngx_http_headers_module模块 一. 前言 ngx_http_headers_module模块提供了两个重要的指令add_header和expires,来添加 “Expires” 和 “Cache-Control” 头字段,对响应头添加任何域字段。add_header可以用来标示请求访问到哪台服务器上,这个也可以通过nginx模块nginx-http-footer-filter研究使用来实现。expires指令用来对浏览器本地缓存的控制。 二. add_header指令 语法: add_header name value; 默认值: — 配置段: http, server, location, if in location 对响应代码为200,201,204,206,301,302,303,304,或307的响应报文头字段添加任意域。如:

阅读全文

type_hinting

从PHP5开始,我们可以使用类型提示来指定定义函数时,函数接收的参数类型。如果在定义函数时,指定了参数的类型,那么当我们调用函数时,如果实参的类型与指定的类型不符,那么PHP会产生一个致命级别的错误(Catchable fatal error)。

阅读全文

tsrm

名词解释: TSRM 线程安全资源管理器(Thread Safe Resource Manager),这是个尝尝被忽视,并很少被人说起的“层”(layer), 她在PHP源码的/TSRM目录下。一般的情况下,这个层只会在被指明需要的时候才会被启用(比如,Apache2+worker MPM,一个基于线程的MPM),对于Win32下的Apache来说,是基于多线程的,所以这个层在Win32下总是被启用的。 ZTS Zend线程安全(Zend Thread Safety),当TSRM被启用的时候,就会定义这个名为ZTS的宏。 tsrm_ls TSRM存储器(TSRM Local Storage),这个是在扩展和Zend中真正被实际使用的指代TSRM存储的变量名。 TSRMLS_?? 这是一族(4个)宏,用来根据ZTS宏被定义与否来实现TSRM。4个宏如下:

阅读全文

create_function

第一部分:介绍php函数 create_function():

阅读全文

Xdebug

Xdebug是一个开源的PHP程序调试工具,可以使用它来调试、跟踪及分析程序运行状态。当然,Xdebug需要结合PHP的编辑工具来打断点、跟踪、调试及分析,比较常用的PHP的Xdebug调试环境:Vim +Xdebug。 Xdebug是一个开源的PHP程序调试工具,可以使用它来调试、跟踪及分析程序运行状态。当然,Xdebug需要结合PHP的编辑工具来打断点、跟踪、调试及分析,比较常用的PHP的Xdebug调试环境:Vim +Xdebug。

阅读全文

vld_dot_graphviz

PHP7.1下 vld扩展的安装使用 PHP7.1下 vld扩展的安装使用 原创 2017年03月29日 08:03:05 595 1)git clone https://github.com/derickr/vld.git

阅读全文

phpvld

vld介绍

阅读全文

phpize

编译PHP扩展的工具,主要是根据系统信息生成对应的configure文件 安装php(fastcgi模式)的时候,常常有这样一句命令:/usr/local/webserver/php/bin/phpize 一、phpize是干嘛的? phpize是什么东西呢?php官方的说明: http://php.net/manual/en/install.pecl.phpize.php phpize是用来扩展php扩展模块的,通过phpize可以建立php的外挂模块 比如你想在原来编译好的php中加入memcached或者ImageMagick等扩展模块,可以使用phpize,通过以下几步工作。 二、如何使用phpize? 当php编译完成后,php的bin目录下会有phpize这个脚本文件。在编译你要添加的扩展模块之前,执行以下phpize就可以了; 比如现在想在php中加入memcache扩展模块:我们要做的只是如下几步 ———————————————————————— tar zxvf memcache-2.2.5.tgz cd memcache-2.2.5/ /usr/local/webserver/php/bin/phpize ./configure –with-php-config=/usr/local/webserver/php/bin/php-config make make install ———————————————————————— 注意./configure 后面可以指定的是php-config文件的路径 这样编译就完成了,还需要做的是在php.ini文件中加入extension值 extension = “memcache.so”

阅读全文

PHP 调试利器之 PHPDBG

PHPDBG是一个PHP的SAPI模块,可以在不用修改代码和不影响性能的情况下控制PHP的运行环境。

阅读全文

php_session

void session_write_close ( void )

阅读全文

composer

参考:http://docs.phpcomposer.com/01-basic-usage.html#composer.json-Project-Setup 自动加载

阅读全文

php-curl-ext

php curl 扩展安装

阅读全文

curl-https-php

php使用curl访问https返回无结果的问题 用curl发起https请求的时候报错:“SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed” 很明显,验证证书的时候出现了问题。

阅读全文

php-spider

$composer install

阅读全文

php怎么判断函数,类,类方法是不是存在

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1php判断系统函数或自己写的函数是否存在
bool function_exists ( string $function_name ) 判断函数是否已经定义例如
if(function_exists('curl_init')){
    curl_init();
}else{
    echo 'not function curl_init';
}
2php判断类是否存在
bool class_exists ( string $class_name [, bool $autoload = true ] ) 检查一个类是否已经定义一定以返回true否则返回false例如
if(class_exists('MySQL')){
    $myclass=new MySQL();
}
3php判断类里面的某个方法是否已经定义
bool method_exists ( mixed $object , string $method_name ) 检查类的方法是否存在例如
$directory=new Directory;
if(!method_exists($directory,'read')){
    echo '未定义read方法!';
}
阅读全文

composer-source

1、安装 curl -sS https://getcomposer.org/installer | php mv composer.phar /usr/local/bin/composer 如果上面出现问题 可以这样 curl -sS https://getcomposer.org/installer | php mv composer.phar /usr/local/bin/composer 如果curl下载较慢,一直卡在downloading 可以这样 wget https://getcomposer.org/installer php installer mv composer.phar /usr/local/bin/composer 2、配置国内源

阅读全文

php-doc

老的版本是phpdoc,从1.3.0开始,更名为phpDocumentor

阅读全文

Search

Recent posts

This blog is maintained by 夏泽民

Get in touch with me at 465474307@qq.com

Subscribe to our mailing list

* indicates required