static变量,是类属性,静态成员属于类,不属于对象。意思是所有这个类的对象共享。举个例子,就是某车次的火车票数,全国各地的用户都可以购买这个车次的火车票,但如何判定该火车票的剩余票数呢?其中一个实现就可以通过static变量实现。将火车票剩余数量定义为static,每次有人购票(不同对象),同步修改该属性(static - 1)
作为静态变量,还可以在多个对象之间共享数据,创建好几个对象的时候,因为每次都是new的,所以创建的对象都不同,如果想让多个对象实例共享同一个变量,就可以用到静态变量。假设要编写一个类来跟踪网页浏览的人数,肯定不希望每次实例化该类时都把访问者数量置0,只是就可以将该属性设置为static
所以,static、global、单例模式,都可以放在数据库连接处,防止多次连接
还有,static最好保存固定值,如果保存动态值,可能会造成污染,导致不可预期的bug
静态属性只能被初始化为文字或常量,不能使用表达式。所以可以把静态属性初始化为整数或数组,但不能初始化为另一个变量或函数返回值,也不能指向一个对象。
但是程序里面赋值可以保存对象
PHP是单进程,不像java多线程,存在内存共享问题,所以有线程同步问题,当然PHP可以借助扩展实现多线程
进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。
线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是的)。
static和并发没任何关系
static变量放在内存堆中,效率会高些
PHP进程取决于php-fpm数量、PHP并发取决于php-fpm数量
当客户端发送一个请求时,web server会通过一个php-fpm进程去执行php代码,php代码的执行是单线程的。
那么,当有多个客户端同时发送请求时(并发),web server会通过php-fpm为每个请求开启一个单独进程去执行php代码
但并发的问题在于,在某一时间,客户端请求让php-fpm进程数量达到了最大限制数,这个时候,新来的请求只能等待空闲的php-fpm进程来处理,这就是多进程同步阻塞模式的弊端,当然还有进程过多所带来的内存占用问题
另:
不同的请求是在不同的php-fpm进程中解析执行的,每个进程(系统进行资源分配和调度的基本单位)是独享内存的互不干扰;
static 静态属性是当脚本执行时就会直接加载到内存(堆)中(理论上比创建一个对象再去调用属性的效率高);
这个static是和并发扯不上关系的,但是恰当的使用static属性理论上会提高脚本执行速度,所以会减少该脚本单位执行次数的时间,从而提高并发时系统的抗压能力。
额外:php的并发数理论上取决于php-fpm的进程数量
关于php-fpm:php运行原理
<?php
class Visitor
{
private static $visitors = 0;
public function __construct()
{
self::$visitors++;
}
public static function getVisitors()
{
return self::$visitors;
}
}
// 实例化
$visitor1 = new Visitor();
echo Visitor::getVisitors() . "\n"; // 1
$visitor2 = new Visitor();
echo Visitor::getVisitors() . "\n"; // 2