站内搜索

本次搜索找到结果 68 条
今天看到一篇讲PHP并发的文章,感觉不错,于是便Copy了下来。原文如下:周末去北京面了两个公司,认识了几位技术牛人,面试中聊了很多,感觉收获颇丰。认识到了自己的不足之处,也坚定了自己对计算机学习的信心。本文是对其中一道面试题的总结。面试中有一个问题没有很好的回答出来,题目为:并发3个http请求,只要其中一个请求有结果,就返回,并中断其他两个。当时考虑的内容有些偏离题目原意,一直在考虑如何中断http请求,大概是在client->recv()之前去判断结果是否已经产生,所以回答的是用socket去发送一个http请求,把socket加入libevent循环监听,在callback中判断是否已经得到结果,如...
今天在使用PHP的CLI方式访问mysql数据库时出现了一个Nosuchfileordirectory的错误,查找资料并在最终解决后记录一下。这个问题应该也会存在于非CLI方式访问,简单的代码是这样的:<?php$mysqli=newmysqli('localhost','root','root','test');如果上面的连接地址是localhost就会报此错误,改成127.0.0.1后正常。当主机填写为localhost时MySQL会采用unixdomainsocket连接,当主机填写为127.0.0.1时MySQL会采用TCP/IP的方式连接。使用Unixsocket的连接比TCP/IP的连接更加快速...
这几天因为需要使用MAC做PHP开发,安装了一个MAMPPRO的试用版,整体感觉非常好用,还可以自由选择PHP版本、Apache扩展、很方便的创建网站并自动修改系统hosts文件等。MAMP和MAMPPRO是两个独立软件,MAMP可以单独运行,支持简单的操作如PHP版本切换、Apache/Nginx切换、启动/停止服务等。MAMPPRO不能独立运行,它需要依赖MAMP软件,其实MAMPPRO就是MAMP的一个功能强大的控制面板,并提供了一些MAMP本身不支持的功能(如修改hosts、DDNS、方便的修改PHP运行方式以及Apache模块、方便的添加和管理虚拟网站等),售价不到400元,你值得拥有~因为我的项目很多...
昨天因为服务器到期把网站迁移到另一台服务器,使用的LNMP架构,网站各部分迁移完成后发现了一个蛋疼的问题:很多网页打开都提示”Noinputfilespecified”,甚至直接404,而且时好时坏。去网上搜了下资料,大概意思如下:任何对.php文件的请求,都简单地交给php-cgi去处理,但没有验证该php文件是否存在。PHP文件不存在,没办法返回普通的404错误,它返回一个404,并带上一句”Noinputfilespecified”另外,还可能跟路径或者权限有关系,或者SCRIPT_FILENAME变量没有被正确的设置(这在nginx是最常见的原因)。因为Nginx的PATHINFO设置是直接复制的之前服务...
到目前为止已经让Worker运行了,我们需要创建并添加任务。这一节主要了解什么是任务(Job),以及如何使用任务。简单的说,任务就是传递给Worker要执行的内容。我们需要把Job依次添加到Queue来执行。要把任务添加到队列,程序必须要包含php-resque库以及Redis。使用require_once'/path/to/php-resque/lib/Resque.php';包含php-resque的库文件,它会自动连接到Redis服务器,如果你的Redis服务器不是默认的localhost:6379,你需要使用Resque::setBackent('192.168.1.56:3680...
注意,这篇教程仅适用于Linux和OSX的系统,Windows并不适用。理解Worker的本质技术上讲一个Worker就是一个不断运行的PHP进程,并且不断监视新的任务并运行。一个简单的Worker的代码如下:while(true){$jobs=pullData();//从队列中拉取任务foreach($jobsas$class=>$args){//循环每个找到的任务$job=new$class();$job->perform($args);//执行任务}sleep(300);//等待5分钟后再次尝试拉取任务}以上这些代码的具体实现都可以交给php-resque。创建一个Worker,php-resq...
在第二部分我们使用php-resque作为队列系统,这一节讲如何安装php-resque。PHP-Resque是依赖Redis的,所以需要先安装Redis及PHP的Redis扩展。以下是所有需要安装的组件:RedisPHP的Redis扩展(php-redis)php-resquePHP的PCNTL扩展RedisRedis是一个开源的KV数据库,数据是保存在电脑RAM中的,速度非常快,所以通常可以使用Redis来做缓存,或保存Session等。可以在Redis的官方网站下载最新稳定版本。Redis的安装方法本文不再赘述,安装完成后不要忘记启动。PHP-Resquephp-resque是resque的PHP版本,很多...
接着第一部分,Queue需要保存Jobs,Worker需要按照指定的时间间隔在Queue中轮循并执行Jobs。这个系统包含以下三个部分:推送者:推送任务到Queue,可以是任何过程,甚至是Worker;Queue:按顺序保存Jobs;Worker:从Queue中拉取Jobs并执行。注意,这里使用了推送(Push)和拉取(Pull)来代替添加(Add)和获取(Get)。Push:把数据添加到栈的尾部的操作。**_Pull(orPop):_**拉取(或弹出)。弹出并删除栈顶部的数据。Push操作通常会把数据添加到栈的尾部。这种数据类型会保证先添加到队列的项目总是先被读取和删除,即“先进先出”(FIFO,First-i...
什么是后台任务?后台任务就是运行在程序流程以外的任务,毕竟PHP作为网站后台语言是需要在执行后立即返回数据的,而且一般服务器都有设置执行的超时时间,所以使用PHP去完成一些比较耗时的后台操作就有些问题了。通常在做一些比较耗时的操作时都会想到使用一个后台任务以及任务队列,在流程外执行这些操作,并立即返回给前台一个正在执行的提示。我们来看一个实例:一个社交网站,某用户修改了他的的个人资料中的所在地。一般的流程是这样的:PHP并不是多线程的,所以所有任务必须在前一个任务完成后再能开始,这就会致使用户等待较长的时间。上面例子中,大约3.7秒后用户才能获取到来自服务器的反馈,用户体验较差。需要注意的是在整个流程中最重要的仅...
本人写代码有个毛病:不喜欢把代码写死,总要留出些扩展的余地(其实也不算什么缺点吧,好处是有的,但老是这样对于一些小项目来说太浪费时间了)。对于写一个可扩展的项目而言,插件机制似乎是必须的。例如我们需要在从数据库中获取到文章内容后执行一些操作,如转换代码高亮的符号为对应的pre标签、转换Emoji表情符号为图片地址或类、给文章内所有的图片加上LightBox效果的代码等等,如果把这些操作统统都写到Post类中,这个类将会在以后的代码升级过程中变得越来越大,并且越来越难维护。了解过Wordpress的插件机制的可能都知道,WP会这么做(演示代码,并非抄自WP)://插件内//添加过滤器函数add_filter('th...