php怎么优化调用第三方接口的速度?
php优化调用第三方接口速度可以通过代码优化,curl_multi_init 是 并行地处理批处理cURL,采用它可以实现标准化响应,避免浪费请求资源。
首先,foreach合理使用,尽量少在循环中套用循环,在循环次数过多的情况下,非常耗性能。
循环中,尽量避免数据操作,特别是查询操作,在循环次数过多的情况下,多次调用效率很低,可一次获取数据再拼接。
同理,在循环中,避免配置的多次获取,和time()函数方法的调用,这种一次声明就可以重复使用。
在php中,单引号和双引号是有区别的,作为一种习惯字符串我都用单引号,因为它无需编译,对于效率,可能谈不上差异大小,可能就一点点。
合理利用在php中的函数,像数组函数就非常丰富,要充分利用,一般不要自己去做他本身就支持的函数方法
可以用上字典的概念,将数组以新索引形式存储起来,我在数据的重组中很常用
根据场景,合理使用缓存可以减少重复的数据查询,提高效率
合理拆分功能,比如一个列表查询,并带有详情查看,可以将此处拆成两个接口实现,在需要时获取数据,减少资源浪费。
如何清除php的缓存区?
缓存区是指什么缓存,一般是逻辑缓存跟进程缓存(不知道这个名词对不对,反正就这个意思)。
逻辑缓存指的是文件缓存,redis之类的,这种你把对应的文件或者上redis-client清除就可以了。如果是进程缓存,一般生命周期不长,页面结束就会回收的,所以这个不用特意清,这个的清除方式是重启服务,如果用fast-cgi就重启php-fpm。如果是用apache的module加载,就重启apachephp为啥速度快?按说每次访问重新执行能快才怪?
PHP也有JIT即时编译执行,PHP实现了一个虚拟机Zend VM,可以把脚本编译成虚拟机指令,运行时候就直接执行这些指令就好了。没有JIT之前,一般都是通过PHP-FPM处理,速度也挺快!
什么是php进程?
一、PHP进程模型
进程的概念是操作系统的结构的基础。Multics的设计者在20世纪60年代首次使用了这个技术词语,它比作业更通用一些。关于进程的定义,如下所示:
1、一个正在执行的程序。
2、计算机中正在运行的程序的一个实例。
3、可以分配给处理器并由处理器执行的一个实体。
4、由单一的顺序的执行线程、一个当前状态和一组相关的系统资源所描述的活动单元。
二、进程与线程区别
进程是资源分配的基本单位。所有与该进程有关的资源,都被记录在进程控制块PCB中。以表示该进程拥有这些资源或正在使用它们。
另外,进程也是抢占处理机的调度单位,它拥有一个完整的虚拟地址空间。当进程发生调度时,不同的进程拥有不同的虚拟地址空间,而同一进程内的不同线程共享同一地址空间。
与进程相对应,线程与资源分配无关,它属于某一个进程,并与进程内的其他线程一起共享进程的资源。
线程只由相关堆栈(系统栈或用户栈)寄存器和线程控制表TCB组成。寄存器可被用来存储线程内的局部变量,但不能存储其他线程的相关变量。
通常在一个进程中可以包含若干个线程,它们可以利用进程所拥有的资源。在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位。由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度,从而显著提高系统资源的利用率和吞吐量。因而近年来推出的通用操作系统都引入了线程,以便进一步提高系统的并发性,并把它视为现代操作系统的一个重要指标。
线程与进程的区别可以归纳为以下4点:
(1)进程是资源的分配和调度的一个独立单元,而线程是CPU调度的基本单元
(2)同一个进程中可以包括多个线程,并且线程共享整个进程的资源(寄存器、堆栈、上下文),一个进行至少包括一个线程。
(3)进程的创建调用fork或者vfork,而线程的创建调用pthread_create,进程结束后它拥有的所有线程都将销毁,而线程的结束不会影响同个进程中的其他线程的结束
(4)线程是轻量级的进程,它的创建和销毁所需要的时间比进程小很多,所有操作系统中的执行功能都是创建线程去完成的
(5)线程中执行时一般都要进行同步和互斥,因为他们共享同一进程的所有资源
(6)线程有自己的私有属性TCB,线程id,寄存器、硬件上下文,而进程也有自己的私有属性进程控制块PCB,这些私有属性是不被共享的,用来标示一个进程或一个线程的标志
三、进程间通信方式
1、管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;
2、信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数);
3、报文(Message)队列(消息队列):消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
4、共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。
5、套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。
面试高级php工程师,一般会问到哪些问题?
高并发大访问量的mysql优化,服务器优化?
字段建索引、主从数据库、读写分离、表分区、负载均衡。
linux的慢查询日志会记录mysql的超时查询sql语句,定期察看进行优化。
2.大访问量下秒杀模块程序怎么设计,如果使用mysql会有多卖的情况,就是订单超过库存。
将订单数据缓存到内存,如果用数据库直接崩掉,毫无悬念的。
3.缓存的使用
能用静态的用静态,不能静态的用内存缓存,例如memcache、redis,不能缓存的用数据库。
4.session可不可以跨域?怎么跨域?
将PHP session机制重写(PHP提供),将session存储在memcache或者数据库就可以跨域了。
另外session能以三种方式存储,文件、数据库、缓存。
5.了不了解非关系型数据库?
mongodb
6.会不会写shell脚本以及linux的操作
还会问一下时下流行的东西,比如做没做过微信开发,例如微信支付开发、APP移动开发,等等问题。
问的核心东西都是围绕这些转的,如果有笔试会让你写sql,php功能(例如冒泡排序等排序),还有逻辑题。
我当初面试了很多,这是一个我的面试经验的总结,纯手打忘采纳。