我有一些脚本需要同时运行作为单独的过程.我的计划是要有一个cron作业,以设定的间隔执行这些脚本的多个实例.这是一个好主意吗?这种方法有什么利弊?我还有其他选择需要考虑吗? 底线:我正在尝试模仿多线程.任何种族条件都将通过代码(例如DB中的设置状态等)来处理.这些脚本应该执行处理密集任务(例如创建缩略图等). 解决方案 您可以使用叉子.启动脚本将加载所有默认的配置和初始化,然后加载子进程以进行处理.然后,它可以监视过程以查看它们是否仍在运行. http://php.net/manual/manual/enual/en/function.pcntl-fork.php 其他解决方案 好吧,如果您需要它作为一个cronjob,请继续.如果需要多个流程,您很可能想使用其他解决方案 取决于您想对这些工作做出反应的速度以及您要执行处理器密集型任务的速度,那么您还可以使用排队系统分散处理.请查看
以下是关于 concurrency 的编程技术问答
我最近一直在PHP上进行一些网络开发工作,这使我一般地研究了该语言.到目前为止,我不需要使用它与数据库进行交互,但是我知道它为此提供了许多方便的功能. 尽管我知道基本的SQL并与数据库中的数据进行了基本操纵,但我不知道如何在PHP/JavaScript/SQL围绕网站基础的Web开发人员能够管理在相同相同的相同数据的用户修改相同数据时间. 例如,可以说您有一个二十一点网站,该网站在注册时将用户分为两个团队之一.每次用户赢得游戏时,他们的一部分奖金都会添加到该团队的运行总数中. 因此,可以说执行此功能的功能的伪代码: ... $total = mysql_query("SELECT score FROM team1"); $total = $total + $mytotal; mysql_query("UPDATE team1 SET score='".$total."'"); ... 如果两个玩家同时播放,他们很可能都会在另一个人有机会增加和更新表之前呼叫选
某人智能可以共享他们使用的设计模式,以避免学说\ Symfony中的基本和常见的并发问题? 方案:每个用户必须具有唯一的用户名. 失败的解决方案: 添加遵循 为什么会失败:在验证和持久用户之间,用户名可以由另一个用户获取.如果是这样,学说在尝试坚持最新用户时会引发独立的theaintaintViolationException. 解决方案 这是我以下答案的作用: 如果发生约束违规行为,它会优雅地显示给用户错误,例如验证者处理它, 它可以防止非"受保护" 打破控制器逻辑的数据库更新(例如,使用Update语句或使用"未经保护" 提交表单.控制器), 它是一个独立于数据库的解决方案. 这是代码,并在评论上进行了解释:
我正在尝试理解非阻止羊群和flock flock $fp = fopen('/tmp/lock.txt', 'r+'); if(flock($fp, LOCK_EX | LOCK_NB, $wouldblock)) { echo 'Lock obtained'; } else{ echo 'Unable to obtain lock'; } fclose($fp); 文档说明了关于block: 如果锁定锁定(EwoldBlock Errno条件),则将可选的第三个参数设置为1. 在测试环境中复制并发条件,如果另一个过程获得锁定,则羊群功能将立即返回false(非阻止) 那么,我为什么要关心 $ ward block 值,如果羊群在非块模式下的羊群函数的返回值都告诉我无法获得锁? 我无法获得羊群函数返回false和设置为1的$ ward block参数之间的区别,以及$ will block grognm comgent of. 解决方案
我有一个Lapp(Linux,Apache,PostgreSQL和PHP)环境,但是在Postgres或MySQL上的问题是相同的. 我有一个我开发的CMS应用程序,可以处理客户端,文档(估计,发票等)和其他数据,并在1个Postgres DB中构成了许多架构(一个使用该应用程序的客户);让我们假设大约200个模式,每个模式都由15个人(AVG)同时使用. 编辑:我确实在每个表上都有一个名为last_update的时间戳字段,并且每次更新时都会更新时间戳. 情况是: People Foo和Bar正在使用每个文档详细信息的表格进行编辑0001. foo更改货物的详细信息. 酒吧更改电话号码,并在文档中进行一些项目. foo按"保存"按钮,应用程序更新DB. 吧台在酒吧后按"保存"按钮,将表格带入旧装运详细信息. 在数据库中,foo更改丢失了. 我想拥有的情况: People Foo,Bar,John,Mary,Paoul使用每个文档详细信息的表
我需要在PHP中使用静音或信号量,这让我感到恐惧.为了澄清,我并不害怕编写适当同步或害怕并发编程的危险的无僵硬代码,而是PHP处理边缘案例的功能. 快速背景:编写位于用户与第三方信用卡网关之间的信用卡处理程序接口.需要防止重复的请求,并且已经有一个适当的系统可以有效,但是如果用户列出提交(启用了JS,以便我无法为其禁用按钮)毫秒)毫秒,则随后将在我的PHP脚本的位置进行竞赛条件没有意识到已经提出了重复的请求.需要信号量/互斥X,因此我可以确保每次独特的交易仅通过一个成功的请求. 我正在通过php-fpm在多核Linux计算机上使用多个进程在NGINX后面运行PHP.我想确保 所有PHP-FPM过程与所有内核之间共享信号量(I686内核). php-fpm在持有静音/信号量并相应发布时处理PHP过程崩溃. php-fpm在持有静音/信号量并相应发布时处理会话中止. 是的,我知道.非常基本的问题,认为没有其他任何软件都不存在适当的解决方案是很愚蠢的.但这是php,
我了解,PHP支持处理多个并发连接,并取决于服务器,它可以如下所述配置./p> 服务器如何管理多个连接,它是为每个请求分叉一个子进程,还是使用线程处理或使用线程池处理? 链接答案说一个过程已分配,然后作者在评论中说线程或过程,这使它感到困惑,如果使用儿童处理,线程或线程池提供请求? 解决方案 我知道,每个Web服务器都有自己处理多个同时请求的一种. 通常,Apache2 Schould为每个新请求提供一个子进程.但是您可以以某种方式配置链接的stackoverflow答案中提到的此行为. nginx例如,在一个线程中获取每个请求(像node.js一样,新的连接是异步的),或者有时使用缓存(如配置; nginx也可以用作负载平衡器或HTTP代理).这是为您的应用程序选择合适的Web服务器的一件事. apache2可能是一个非常好的网络服务器,但是当您想在生产中使用它时,您需要更多的负载平衡.但是,当具有短短持久连接甚至根本不会更改的文档(或使用缓存)时,它也
如何在 php mysql 中达到 508资源限制 我的网站是由MySQL和JavaScript Ajax在PHP中开发的. 我的网站被阻止, 如何在此问题中立即纠正,任何人都可以迅速帮助我 请. 但AM有波纹管错误, Resource Limit Is Reached The website is temporarily unable to service your request as it exceeded resource limit. Please try again later. Apache/2.4.12 (Unix) OpenSSL/1.0.1e-fips mod_bwlimited/1.4 Server at domain.co.in Port 80 什么是并发连接 如何将最大并发连接设置为MySQL 任何解决方案都可以解决此问题 解决方案 什么是数据库并发连接? 并发连接是与数据库同时进行的连接. 在共享托管上,有一些
我想知道在PHP中使用HTTP请求的最佳方法是什么?我有很多数据要获取,我宁愿一次执行多个请求来检索所有数据. 有人知道我该怎么做吗?最好在匿名/回调功能Mannor中... 谢谢, 汤姆. 解决方案 您可以使用 curl_multi ,它在内部发射了多个.单个卷曲手柄下的单独请求. ,但否则php本身并非以任何方式/形状/形式"多线程",并且不允许并行运行,除非通过GROSS HACKS(多个并行脚本,一个脚本通过exec()触发多个背景任务,等等...). 其他解决方案 您可以尝试 curl_multi()或使用较低的函数 socket_select() 其他解决方案 您可以使用httprequestpool /人/de/httprequestpool.construct.php $multiRequests = array( new HttpRequest('http://www.google.com', HttpReque
我有一个Symfony 2.5应用程序,我在请求并发时有一些奇怪的问题. 演示我创建了两个称为/time和/sleep的问题.控制器的身体很简单: timeAction(): time(); sleepAction() sleep(30); 当我在浏览器中请求/time路由时,它会随当前时间戳暂时响应.但是,当我第一次请求/sleep路由然后/time路由时 - 它只是挂在那里,直到sleep()完成.只有此后,/time控制器才会使用时间戳响应.换句话说 - 一个请求正在阻止所有请求.一开始我什至没有注意到这一点,但是当您有长期执行计划的请求时 - 很明显. 这样做的原因是什么? 我仍将自己进行一些其他测试,以更深入地研究这种情况.我将尝试使用更多详细信息更新问题. 解决方案 更新 看起来PdoSessionHandler现在使用了自己的某些锁定机制,可以防止并发请求.旧解决方案将不再开箱即用. 对并发问题的官方解决方
编辑:更新 - 向下滚动 编辑2:更新 - 解决问题 一些背景信息: 我在Java上写自己的Web服务器,几天前我问了Apache与PHP的确切接口,因此我可以实现PHP支持.我了解到FastCGI是最好的方法(因为MOD_PHP不是一个选项).因此,我已经查看了FastCGI协议规范,并设法为服务器编写了一个工作的FastCGI包装器.我已经测试了phpinfo(),并且它起作用,实际上所有PHP功能似乎都很好(发布数据,会话,日期/时间等). 我的Web服务器能够同时提供请求(IE User1可以与user2同时检索file1.html与客户的连接被取消). 但是,它不能同时处理2个(或更多)FastCGI请求.它的作用是,它排队排队,因此当请求1立即完成后,它开始处理请求2.我用2个PHP页面进行了测试,一个包含睡眠(10)和另一个phpinfo(). . 我知道我该如何处理多个请求(在IIS下以fastcgi运行的php,它可以很好地处理多个请求).
背景:我正在处理一个系统,在该系统中,开发人员似乎正在使用一个函数,该函数每当需要获取最后一个插入行的ID时("SELECT MAX(id) AS id FROM TABLE")(如"SELECT MAX(id) AS id FROM TABLE") . 我知道这是一种可怕的做法(因为并发请求会弄乱记录),我试图将其传达给非技术/管理团队,他们的回应是... "Oh okay, we'll only face this problem when we have (a) a lot of users, or (b) it'll only happen when two people try doing something at _exactly_ the same time" 我不同意这两个点,并认为我们会比计划要早得多地遇到这个问题.但是,我正在尝试计算(或算一种机制),以计算在开始看到混乱的链接之前,应计算多少用户. . 对此有任何数学见解吗?再次,
我正在PHP中构建一个小型Web应用程序,该应用程序将一些信息存储在纯文本文件中.但是,我的应用程序的所有用户在某个给定的时间点和可能的同时使用了我的所有用户. . 所以问题是.确保只有一个用户可以在任何给定时间点上更改文件的最佳方法是什么? 解决方案 您应该在文件上锁定 $fp = fopen("/tmp/lock.txt", "r+"); if (flock($fp, LOCK_EX)) { // acquire an exclusive lock ftruncate($fp, 0); // truncate file fwrite($fp, "Write something here\n"); fflush($fp); // flush output before releasing the lock flock($fp, LOCK_UN); // release the loc
基准文档说并发是同时完成多少请求,而请求的数量是请求总数.我想知道的是,如果我将100个请求放在20的并发级别上,这是否意味着同时同时使用20个请求的5个测试,或者每个同时同时对20个请求进行100个测试?我假设第二个选项,因为下面引用的示例号. 我想知道,因为我经常在某些测试博客上看到类似的结果: Complete requests: 1000000 Failed requests: 2617614 这似乎是不可信的,因为失败请求的数量高于总请求的数量. 编辑:显示上述数字的网站: http://zgadzaj.com/基准测试nodejs-basic-performance-tests-against-apache-php 或者可能一直在尝试直到达到100万成功?嗯... 解决方案 这意味着一个单一的测试,总共有100个请求,始终保持20个请求.我认为您遇到的误解是所有请求都需要相同的时间,这实际上从来都不是这种情况. AB没有以20批次的批量发行
您能建议一种方法如何使用学说实施SELECT FOR UPDATE? 我需要读取一个计数器值,然后在php代码中使用它,然后立即将其值(来自另一个过程)使用相同的值之前递增值. 解决方案 锁定支持 学说2实现find('User', $theEntityId, LockMode::OPTIMISTIC, $expectedVersion); // do the work $em->flush(); } catch(OptimisticLockException $e) { echo "Someone else has already changed this entity. Apply the
我的VPS服务器有以下问题. 我有一个长期运行的PHP脚本,将大文件发送到浏览器.它做类似的事情: 这基本上从服务器的文件系统中读取文件,并将其发送到浏览器.我不能只使用直接链接(并让Apache服务文件),因为应用程序中有业务逻辑需要应用. 问题是,当该下载正在运行时,网站无法响应其他请求. 解决方案 您所遇到的问题与您正在使用会议的事实有关.当脚本具有运行会话时,它会锁定会话文件以防止并发写作可能会损坏会话数据.这意味着不会同时执行来自同一客户端的多个请求 - 使用同一会话ID,它们将被排队,并且一次只能执行一个. 多个用户将不会遇到此问题,因为他们将使用不同的会话ID.这并不意味着您没有问题,因为您可能想在下载文件时访问网站,或设置多个文件.
这是我的问题:我有一个脚本(让我们称之为comet.php)由ajax客户端脚本重新固定,然后等待这样的更改: while(no_changes){ usleep(100000); //check for changes } 我不太喜欢它,它不是很可扩展,而且(恕我直言)"不良练习" 我想通过信号量(?)或并发编程来改善这种行为 技术.您能给我一些有关如何处理的提示吗? (我知道,这不是一个简短的答案,但起点就足够了.) edit : libevent ? 解决方案 您可以使用 Zeromq . 来解决此问题. Zeromq是一个库,提供了用于插入事物(线程,进程甚至单独的机器)的增压插座. 我假设您正在尝试将数据从服务器推向客户端.好吧,一个好方法是使用 Eventsource api ( client.js 通过Eventsource连接到stream.php. var stream = new EventSource('