首页
关于
Search
1
给你10个市场数据调研报告的免费下载网站!以后竞品数据就从这里找!
184 阅读
2
php接口优化 使用curl_multi_init批量请求
144 阅读
3
《从菜鸟到大师之路 ElasticSearch 篇》
107 阅读
4
2024年备考系统架构设计师
104 阅读
5
PHP 文件I/O
92 阅读
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
登录
Search
标签搜索
php函数
php语法
性能优化
安全
错误和异常处理
问题
vue
Composer
Session
缓存
框架
Swoole
api
并发
异步
正则表达式
php-fpm
mysql 索引
开发规范
协程
dafenqi
累计撰写
786
篇文章
累计收到
32
条评论
首页
栏目
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
副业
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
页面
关于
搜索到
560
篇与
的结果
2023-08-08
PHP 线程,进程和并发
PHP 线程,进程和并发进程进程是什么?进程是正在执行的程序;进程是正在计算机上执行的程序实例;进程是能分配给处理器并由处理器执行的实体。 进程一般会包括指令集和系统资源集,这里的指令集是指程序代码,这里的系统资源集是指I/O、CPU、内存等。 综合起来,我们也可以理解进程是具有一定独立功能的程序在关于某个数据集合上的一次运行活动, 进程是系统进行资源分配和调度的一个独立单位。在进程执行时,进程都可以被唯一的表示,由以下一些元素组成:进程描述符:进程的唯一标识符,用来和其它进程区分。在Linux中叫进程ID,在系统调用fork期间生成,只是我们通过getpid返回的不是其pid字段,而是其线程组号tgid。进程状态:我们常说的挂起、运行等状态,其表示的是当前的状态。优先级:进程间的执行调度相关,相对于其它进程而言。程序计数器:程序中即将被执行的下一条指令的地址,该地址是内核术中或用户内存空间中的内存地址。内存指针:包括程序代码和进程相关数据的指针,还有和其它进程共享内存块的指针。上下文数据:进程执行时处理器的寄存器的数据。I/O状态信息:包括显式的I/O请求、分配给进程的I/O设备等记账信息:可能包括处理器时间总和、使用的时钟数总和、时间限制等以上的这些元素都会放在一个叫做进程控制块的数据结构中。进程控制块是操作系统能够支持多进程和提供多处理的结构。 当操作系统做进程切换时,它会执行两步操作,一是中断当前处理器中的进程,二是执行下一个进程。 不管是中断还是执行,进程控制块中的程序计数器、上下文数据和进程状态都会发生变化。 当进程中断时,操作系统会把程序计数器和处理器寄存器(对应进程控制块中的上下文数据)保存到进程控制块中的相应位置, 进程状态也会有所变化,可能进入阻塞状态,也有可能进入就绪态。 当执行下一个进程时,操作系统按规则将下一个进程设置为运行态,并加载即将要执行进程的程序上下文数据和程序计数器等。线程进程有两个特性部分:资源所有权和调度执行。 资源所有权是指进程包括了进程运行所需要的内存空间、I/O等资源。 调度执行是指进程执行过程中间的执行路径,或者说程序的指令执行流。 这两个特性部分是可以分开的,分开后,拥有资料所有权的通常称为进程,拥有执行代码的可分派部分的被称之为线程或轻量级进程。线程有“执行的线索”的意思在里面,而进程在多线程环境中被定义为资源所有者,其还是会存储进程的进程控制块。 线程的结构与进程不同,每个线程包括:线程状态: 线程当前的状态。一个执行栈私有的数据区: 用于每个线程局部变量的静态存储空间寄存器集: 存储处理器的一些状态每个进程都有一个进程控制块和用户地址空间,每个线程都有一个独立的栈和独立的控制块,都有自己一个独立执行上下文。 其结构如图8.1所示。hread-model图8.1 进程模型图线程在执行过程中与进程有一些不同。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。 但是线程不能够独立执行,必须依存在于进程之中,由进程提供多个线程执行控制。 从逻辑角度来看,多线程的意义在于一个进程中,有多个执行部分可以同时执行。 此时,进程本身不是基本运行单位,而是线程的容器。线程较之进程,其优势在于一个快,不管是创建新的线程还是终止一个线程;不管是线程间的切换还是线程间共享数据或通信,其速度与进程相比都有较大的优势。并发及并行并发又称共行,是指能处理多个同时性活动的能力,并发事件之间不一定要同一时刻发生。 比如,现代计算机系统可在同一段时间内以进程的形式将多个程序加载到存储器中,并借由处理器的时分复用, 以在一个处理器上表现出同时运行的感觉。并行是指同时发生的两个并发事件,具有并发的含义,而并发则不一定并行。并发和并行的区别就是一个处理器同时处理多个任务和多个处理器或者是多核的处理器同时处理多个不同的任务。 前者是逻辑上的同时发生(simultaneous),而后者是物理上的同时发生。PHP的各种并发模型既然有两种模型,那么PHP使用的是哪一种呢?答案是都支持,也就是说PHP支持多线程的模型, 在多线程情况下通常要解决资源共享和隔离的问题。PHP本身是线程安全的。具体来说是那种模型需要看使用的是哪个SAPI,比如说在Apache中,那么就可能使用多线程模型, 也可能使用多进程模型。而php-fpm使用的就是多进程模型。目前比较推荐的方式是使用php-fpm的模型,因为这个模型对于PHP来说有诸多的优势:内存释放简单,使用多进程模型时进程可以容易通过退出的方式来释放内存, 由于PHP有非常多的扩展,稍有不慎就可能导致内存泄露,fpm通过进程退出方式 简单除暴的解决了问题。容灾能力强,同样的问题,扩展或者php可能会出现段错误,如果是单进程多线程模型, 那么整个PHP就挂掉了。这会影响服务,多进程的话,某个进程死掉了也不会影响整体的服务。多进程有多进程的优势,多线程也有多线程的优势,比如HHVM它选择的是多线程模型。 多线程模型最大的好处是信息共享和通信方便,因为在同一个进程空间内,可以直接使用指针。比如opcode cache工具,在PHP里,apc以及opcache等等使用的是共享内存来共享opcode, 那么在HHVM中则不需要走共享内存,共享内存还有个问题是存储复杂的数据结构不方便, 因为指针的问题,多线程情况下C/C++中的数据结构是可以共享的。这对效率提升也是有帮助的。多进程和多线程还有一个明显的模型区别:在处理请求时的逻辑。在多进程情况下,由于跨进程是不好传递fd连接的。那么多进程通常采用在父进程中listen(), 然后各个子进程accept()的方式来实现负载均衡。这样的模型下可能会有惊群的问题。而多线程模型下,可以采用一个独立线程接受请求然后派发到各个worker线程的方式。参考资料《操作系统精髓与设计原理》
2023年08月08日
16 阅读
0 评论
0 点赞
2023-08-08
关于编程语言
关于编程语言最近群里很多朋友询问我是如何学习编程的,今天抽个时间大致讲讲。C语言和所有人一样,上学学的第一门编程语言是C语言。我记得我当时学的很认真,非常认真。和别人最大的不同是我买了一本老外写的C语言编程书,没被谭浩强误导。另外还买了一本《现代操作系统》一书看了很久。学习期间写了不少读书笔记。真正要说学到什么了,这个还真不好说,到最后我对C语言也是似懂非懂的状态。用学物理、数学的方法学编程语言是行不通的,编程需要的是实践。Java学Java的目的很明确,为了找一份好工作。面向对象、J2EE、Java设计模式、SSH的书买了好几本。最后还是没能够入门。原因我后来分析主要是2点,1、Java太复杂了,根本就不适合初学者。2、犯了和学习C语言同样的错误,读书太多,实践太少(主要是不会搭建Java的开发环境)。PHP偶然的机会了解到了PHP语言,按照网上的教程一搞,写了一个MySQL的网页程序,竟然运行成功了。这实在太神奇了。你们无法理解当时我的心情,可以说到了 高兴地3天不用吃饭的程度。呵呵,当时我就下定决心以后就是它了。PHP让我进入了一个新的境界,我可以大量地实践,写出各种程序。而且也顺利找到了工作,干的风生水起,一个接一个地做了很多项目。后来又进入腾讯,在腾讯有机会去开发维护一个超过2亿用户,日活超过8千万,机器规模超过1000多台的超大系统。我的人生的各种成果都归功于PHP这门伟大的编程语言。重新回到C语言当然后面也逐渐认识到PHP的不足,不过很快我就发现可以写C扩展来弥补。重新学起C语言,我发现竟然很顺利。原因应该是我在写PHP程序的过程中,工程实践能力已经磨练到非同一般。其实不只是C语言,只要我愿意,C++,Java,Python,Golang任何语言都可以快速掌握。然后就开始搞Swoole这个项目,边学边做。经过这2年的时间,现在可以说我已经掌握C语言了。为什么会回到C语言,原因很简单:所有底层软件都是C语言写的,包括操作系统、底层库、驱动、其他编程语言本身。C语言一切现代软件技术的根源。我的个人感悟我的编程之路轨迹就是 C语言(起始) -> Java(过客)-> PHP(主)-> C语言(终点)。编程语言专注于一个就行了,Java、PHP、Python、Ruby 任意一个都行。只要能把一门编程语言学精通,其他语言学起来也很容易。工作时选择的编程语言,应该是一主多辅。做Web得了解Javascript,做APP需要掌握Android、Object-C,写桌面程序需要学习C++。带着问题去学就好了。不要选择难或者复杂的编程语言作为入门,易于上手的编程语言更容易成功。公司有一个搞Java 9年的人,技术等级很低。很好的例子。另外一个只工作了5年的PHPer现在已经是T3-2的技术Leader了。编程最核心的是动手实践多看一看别的编程语言和技术,开阔一下视野编程做到最后还是会回到C语言的,当然很多人中途就已经离开编程岗位了
2023年08月08日
12 阅读
0 评论
0 点赞
2023-08-08
关于C++、PHP和Swoole
关于C++、PHP和Swoole昨天和一个前同事聊天,各种吐槽PHP,吐槽Swoole,他认为PHP到处是坑,PHP局限很大。PHP+Swoole不适合做高并发服务器,C+Swoole才是最好的方案。C++有各种数据结构,C++可以开线程,C++可以共享对象。看来有必要好好得说明一下了。PHP比C/C++或Java少了什么?多线程,多线程,多线程……是的。PHP比C/C++、Java少了多线程。PHP只有多进程的方案,所以PHP里的全局变量和对象不是共享的、数据结构也不能跨进程操作、Socket文件描述符不能共享等等。所以PHP有局限?多线程看似比多进程要强大很多,实际上我可以负责任的告诉你,多线程带来的坑更多。数据同步问题会让你崩溃的。要么就牺牲性能到处加锁,要么就用地狱难度的无锁并发编程,据我所知目前国内能掌握此项技能的人凤毛麟角。不要以为加锁就万事大吉了,你会在死锁问题上栽个大跟头。当你的程序逻辑复杂后,锁越来越难控制了,一旦死锁你的程序基本上就完了。某个线程挂了那所有线程都会退出反而在看多进程,其实就简单的多了。配合进程间通信,基本上你可以实现任意的数据共享。比如利用一个进程专门存数据结构和对象,其他进程的数据操作全部投递到此进程来多进程不需要锁多进程可以使用共享内存的数据结构实现一些多线程的功能。如Swoole提供的Table、Atomic可以实现数据共享,但成本很低。未来还会加入共享内存队列所谓PHP限制了Swoole,这完全是无稽之谈。合理利用Swoole提供的Table、Atomic、SendMessage/PipeMessage、Task完全可以实现异步非阻塞的代码逻辑。C++写出来的程序性能更好?这完全是盲目的迷信,密集计算的程序C++确实是有优势的。而并发服务器核心是IO,并非大规模密集运算。C++从语言层面来看并没有什么优势。另外C++中的大部分数据结构在PHP中都有对应的实现,实在不行自己写个专门的扩展也能解决之。高并发的服务器单机能维持10W连接、每秒可处理3-5W笔消息收发。这种性能水准已经可以应用在BAT的核心系统上了。开发效率快的意义是什么?这位同事还说PHP开发Server虽然比C++快了,但是追求性能的极致还是要用C++。我要告诉你效率高了究竟意义何在。开发一套好程序不是一件容易的事情,需要程序员投入大量时间和精力。开发效率提升的意义并不是简单的我可以更少时间完工,而是剩下的时间你可以增加单元测试、修复BUG、提升用户体验、完善细节、提供配套工具、优化性能、增加关键日志、增加监控报警、增加容灾方案。
2023年08月08日
14 阅读
0 评论
0 点赞
2023-08-08
PHP并行 多进程/多线程
PHP并行 多进程/多线程PHP中提供了一个扩展pcntl,可以利用操作系统的fork调用来实现多进程。fork调用后执行的代码将是并行的。注:pcntl仅支持linux平台,并且只能在cli模式下使用。$pid = pcntl_fork(); if($pid > 0){ //父进程代码 exit(0); } elseif($pid == 0) { //子进程代码 exit(0); }PHP官方没有提供多线程的扩展,pecl中有一个pthreads扩展提供了多线程的特性,地址是http://pecl.php.net/package/pthreads,此扩展仅在线程安全版本中可用。多进程和多线程其实是作用是相同的。区别是线程是在同一个进程内的,可以共享内存变量实现线程间通信线程比进程更轻量级,开很大量进程会比线程消耗更多系统资源多线程也存在一些问题:线程读写变量存在同步问题,需要加锁锁的粒度过大会有性能问题,可能会导致只有1个线程在运行,其他线程都在等待锁。这样就不是并行了同时使用多个锁,逻辑复杂,一旦某个锁没被正确释放,可能会发生线程死锁某个线程发生致命错误会导致整个进程崩溃多进程方式更加稳定,另外利用进程间通信(IPC)也可以实现数据共享。共享内存,这种方式和线程间读写变量是一样的,需要加锁,会有同步、死锁问题。消息队列,可以采用多个子进程抢队列模式,性能很好PIPE,UnixSock,TCP,UDP。可以使用read/write来传递数据,TCP/UDP方式使用socket来通信,子进程可以分布运行利用fork可以实现一个最简单的并发TCP Server。主进程accept连接,有新的连接到来就Fork一个子进程。子进程中循环recv/send,处理数据。这种模式在请求量不多情况下很实用,像FTP服务器。过去有很多Linux程序都是这种模式的,简单高效,几十行代码就可以实现。当然这种模型在几百个并发的情况下还算不错,大量并发的情况下就有点消耗过大了。if(($sock = socket_create(AF_INET, SOCK_STREAM, 0)) < 0) { echo "failed to create socket: ".socket_strerror($sock)."\n"; exit(); } if(($ret = socket_bind($sock, $address, $port)) < 0) { echo "failed to bind socket: ".socket_strerror($ret)."\n"; exit(); } if( ( $ret = socket_listen( $sock, 0 ) ) < 0 ) { echo "failed to listen to socket: ".socket_strerror($ret)."\n"; exit(); } while (true) { $conn = @socket_accept($sock); //子进程 if(pcntl_fork() == 0) { $recv = socket_read($conn, 8192); //处理数据 $send_data = "server: ".$recv; socket_write($conn, $send_data); socket_close($conn); exit(0); } else { socket_close($conn); } }
2023年08月08日
16 阅读
0 评论
0 点赞
2023-08-08
使用php blenc扩展加密php源代码
使用php blenc扩展加密php源代码使用php blenc扩展加密php源代码,不但可以加密源代码,还可以设置过期时间。扩展地址 http://pecl.php.net/package/blenc注意:不要启用opcache扩展,否则加密后的代码无法正常运行。要加密的源码不需要<?php 及?>开始与结束标记可指定个人密钥。可指定一个BLENC模块过期日期。 你可以决定BLENC 模块将工作到一个日期。之后,BLENC不会解密任何文件.这些都可以在头文件 blenc_protect.h中设置,设置好后再编译BLENC.用法:http://cn2.php.net/manual/en/function.blenc-encrypt.php安装用phpize安装 phpize ./configure make make install.注意,如果安装后,访问php出现500错误,请试着打开 php.ini中的expose_php=On;安装扩展后,要使以下文件可写:/usr/local/etc/blenckeys具体加密用法文件:<?php$file='en.php';$file_name = basename($file);$unencrypted_key='itvyyb';$source_code = file_get_contents($file);$html='';const TARGET_DIR='/Library/WebServer/Documents/';//This covers old-asp tags, php short-tags, php echo tags, and normal php tags.$contents = preg_replace(array('/^<(\?|\%)\=?(php)?/', '/(\%|\?)>$/'), array('',''), $source_code);//echo $contents;exit;$html .= "<br> BLENC blowfish unencrypted key: $unencrypted_key" . PHP_EOL;$html .= "<br> BLENC file to encode: " . $file_name . PHP_EOL;//file_put_contents('blencode-log', "---\nFILE: $file_name\nSIZE: ".strlen($contents)."\nMD5: ".md5($contents)."\n", FILE_APPEND);$redistributable_key = blenc_encrypt($contents, TARGET_DIR . '/blenc/' . $file_name, $unencrypted_key);$html .= "<br> BLENC size of content: " . strlen($contents) . PHP_EOL;/**Server keykey_file.blenc*/file_put_contents(TARGET_DIR . '/blenc/' . 'key_file.blenc', $redistributable_key . PHP_EOL);$html .= " BLENC redistributable key file key_file.blenc updated." . PHP_EOL;exec("cat key_file.blenc >> /usr/local/etc/blenckeys");echo $html;?>另一个php加密扩展https://github.com/liexusong/php-beast和这个差不多。php-beast 加密代码使用方法如下,在cli下运行<?phpfunction getext($file) {$list = explode('.', $file);return strtolower($list[count($list)-1]);}function encrypt_project($project, $new_project) {$project = rtrim($project, '/');$new_project = rtrim($new_project, '/');if (!file_exists($new_project)) {if (!mkdir($new_project)) {printf("[failed] failed to call `mkdir()' function\n");return false;}}$hdl_o = opendir($project);$hdl_n = opendir($new_project);if (!$hdl_o || !$hdl_n) {if ($hdl_o) closedir($hdl_o);if ($hdl_n) closedir($hdl_n);printf("[failed] failed to call `opendir()' function\n");return false;}while (($file = readdir($hdl_o)) !== false) {if ($file == '.' || $file == '..') {continue;}$path = $project.'/'.$file;if (is_dir($path)) {encrypt_project($path, $new_project.'/'.$file);} elseif (is_file($path) && getext($file) == 'php') {beast_encode_file($path, $new_project.'/'.$file);} else {copy($path, $new_project.'/'.$file);}}closedir($hdl_o);closedir($hdl_n);return true;}$stdin = fopen("php://stdin", "r");$stdout = fopen("php://stdout", "w");if (!$stdin || !$stdout) {if ($stdin) fclose($stdin);if ($stdout) fclose($stdout);exit("[failed] failed to open I/O stream\n");}fwrite($stdout, "Please enter project path: ");$project = fgets($stdin);$project = trim($project);fwrite($stdout, "Please enter output project path: ");$new_project = fgets($stdin);$new_project = trim($new_project);$start = time();fwrite($stdout, "Encrypting...\n");encrypt_project($project, $new_project); / encrypt project /$spend = time() - $start;fwrite($stdout, "Finish encrypt, spend {$spend} seconds.\n");?>good:<?php/**FileName: encrypt_project.phpDesc: php源码加密Author: LenixEmail: yangyb@itv.cnHomePage: http://www.itv.com.cnVersion: 1.0LastChange: 2015-08-03 13:34:56History:*/function getext($file) {$list = explode('.', $file);return strtolower($list[count($list)-1]);}function encrypt_project($project, $new_project) {$unencrypted_key='itvyyb';//个人密钥$project = rtrim($project, '/');$new_project = rtrim($new_project, '/');if (!file_exists($new_project)) {if (!mkdir($new_project)) {printf("错误,不能调用 `mkdir()' 函数\n");return false;}}$hdl_o = opendir($project);$hdl_n = opendir($new_project);if (!$hdl_o || !$hdl_n) {if ($hdl_o) closedir($hdl_o);if ($hdl_n) closedir($hdl_n);printf("错误,不能调用`opendir()' 函数\n");return false;}while (($file = readdir($hdl_o)) !== false) {if ($file == '.' || $file == '..') {continue;}$path = $project.'/'.$file;if (is_dir($path)) {encrypt_project($path, $new_project.'/'.$file);} elseif (is_file($path) && getext($file) == 'php') {$source_code = file_get_contents($path);$contents = preg_replace(array('/^<(\?|\%)\=?(php)?/', '/(\%|\?)>$/'), array('',''), $source_code);$redistributable_key = blenc_encrypt($contents, $new_project.'/'.$file, $unencrypted_key);file_put_contents( 'key_file.blenc', $redistributable_key . PHP_EOL);$dir=dirname(__FILE__);exec("cat $dir/key_file.blenc >> /usr/local/etc/blenckeys");} else {copy($path, $new_project.'/'.$file);}}closedir($hdl_o);closedir($hdl_n);return true;}$stdin = fopen("php://stdin", "r");$stdout = fopen("php://stdout", "w");if (!$stdin || !$stdout) {if ($stdin) fclose($stdin);if ($stdout) fclose($stdout);exit("错误,不能打开 I/O 流\n");}fwrite($stdout, "请输入项目路径");$project = fgets($stdin);$project = trim($project);fwrite($stdout, "请输入加密后项目路径: ");$new_project = fgets($stdin);$new_project = trim($new_project);$start = time();fwrite($stdout, "加密ing...\n");encrypt_project($project, $new_project);$spend = time() - $start;fwrite($stdout, "完成加密, 用时 {$spend} 秒.\n");?>
2023年08月08日
10 阅读
0 评论
0 点赞
1
...
77
78
79
...
112