Maison > développement back-end > tutoriel php > php 通过curl并发请求计数

php 通过curl并发请求计数

WBOY
Libérer: 2016-06-23 13:49:32
original
1135 Les gens l'ont consulté

function cumulative_number() {
$file = "number.txt";
$current = file_get_contents($file);
$current = (empty($current)) ? 1 : (int)$current + 1;
if(!file_put_contents($file, $current, LOCK_EX)) {
cumulative_number();
}
return $current;
}

我想通过上这个函数实现计数,但是有一个问题,同时有多个访问,那么这个计数就会出问题。问题在同时访问的时候,存在多个访问同时读取了文件里的内容,虽然在写的时候有锁保护,但是因为写入的文本存在相同的内容,那么计数就会出问题了。

我不知道如何解决在读取文件的时候,应用类似锁一样的功能。求帮助


回复讨论(解决方案)

http://www.phpthinking.com/archives/220

兄弟  你提供的资料  对外这个问题没有相关作用啊

http://www.phpthinking.com/archives/220

$fn = 'count.txt';if(! file_exists($fn)) file_put_contents($fn, 1);$fp = fopen($fn, 'r+');if(flock($fp, LOCK_EX | LOCK_NB)) {  $n = fgets($fp);  rewind($fp);  fputs($fp, $n+1);}flock($fp, LOCK_UN);
Copier après la connexion
Copier après la connexion

很抱歉,版主的方法 貌似也会出问题。同时访问的数量少 是没有问题的 ;访问数量多的话,就会出问题了。

$fn = 'count.txt';if(! file_exists($fn)) file_put_contents($fn, 1);$fp = fopen($fn, 'r+');if(flock($fp, LOCK_EX | LOCK_NB)) {  $n = fgets($fp);  rewind($fp);  fputs($fp, $n+1);}flock($fp, LOCK_UN);
Copier après la connexion
Copier après la connexion

失踪了几天,又来了?
这段代码与你原来的效果是一样的,本以为至迟次日就有回应,没想到过了那么多天
去掉 LOCK_NB 就可以了

测试代码

$mh = curl_multi_init();for($i=0; $i<1000; $i++) {       $conn[$i]=curl_init("http://localhost/file_count.php?i=$i");       curl_setopt($conn[$i], CURLOPT_RETURNTRANSFER, 1);       curl_multi_add_handle ($mh,$conn[$i]);}do { $n=curl_multi_exec($mh,$active); } while ($active);foreach ($conn as $ch) {       $res[] = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL) . ' ' .curl_multi_getcontent($ch);       curl_close($ch);}print_r($res);
Copier après la connexion

file_count.php

<?php$fn = 'count.txt';if(! file_exists($fn)) file_put_contents($fn, 1); $fp = fopen($fn, 'r+');if(flock($fp, LOCK_EX /*| LOCK_NB*/)) {  $n = fgets($fp);  rewind($fp);  fputs($fp, $n+1);}flock($fp, LOCK_UN);echo microtime(1) . "  $n";
Copier après la connexion

function chatbackcurl(){    $url = "http://www.XXX.com/peter_linux.php";    for($i=0;$i<30;$i++) {        $oplink[$i]['link'] = $url;    }    $mh = curl_multi_init();    foreach($oplink as $key=>$info) {        $conn[$key]=curl_init($info['link']);        curl_setopt($conn[$key],CURLOPT_RETURNTRANSFER,1);        curl_multi_add_handle ($mh,$conn[$key]);    }    $active = null;    do {        $mrc = curl_multi_exec($mh,$active);    } while ($mrc == CURLM_CALL_MULTI_PERFORM);    while ($active and $mrc == CURLM_OK) {        if (curl_multi_select($mh) != -1) {            do {                $mrc = curl_multi_exec($mh, $active);            } while ($mrc == CURLM_CALL_MULTI_PERFORM);        }    }    foreach ($oplink as $key => $info) {        $oplink[$key]['back_status']=curl_multi_getcontent($conn[$key]);        curl_close($conn[$key]);    }    return $oplink ;}
Copier après la connexion


本人模拟的并发访问代码  如下

多谢版主帮忙了 问题基本上解决了,但是不知道访问量很大的时候  会不会出问题了。

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal