Я думаю, что ваше требование должно быть реализовано с учетом вашего трафика.
Если у вас низкий трафик, внедрение счетчика на основе блокировки не может быть проблемой. Потому что вероятность одновременного доступа к одному и тому же файлу очень мала, а открытие, запись и закрытие файла занимает несколько миллисекунд.
Другим решением может быть использование механизма кэширования memcached, redis или APC и сохранение одного счетчика в хранилище ключей.
Если вы рассматриваете несколько миллионов обращений в секунду, это не может быть размещено на одном сервере. Скорее всего, он масштабируется с помощью балансировщика нагрузки и размещается в разных регионах/серверах. Затем счетчик посещений должен быть реализован неблокируемым сервисом, таким как очередь сообщений. Если вас интересует постановка счетчика посещений в очередь, вы можете узнать больше на rabbitmq, или activemq
RabbitMQ и ActiveMQ поддерживают следующие протоколы и многие другие протоколы, и вы можете найти множество клиентских библиотек php для подключения по этим протоколам.
Несколько примеров кода
Использование APC в качестве счетчика
<?php
apc_add('counter', 0);
echo apc_inc('counter')
?>
Использование Memcached
<?php
$m = new Memcached();
$m->addServer('localhost', 11211);
$m->add('counter', 0);
$m->increment('counter');
?>
RabbitMQ и php-amqplib
композитор.json
{
"require": {
"videlalvaro/php-amqplib": "2.5.*"
}
}
$ composer.phar install
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();
$channel->queue_declare('counter', false, false, false, false);
$callback = function($msg) {
// $msg->body has the content of the message
// counter update implementation goes here
};
$channel->basic_consume('counter', '', false, true, false, false, $callback);
while(count($channel->callbacks)) {
$channel->wait();
}
?>
person
Pradeep Sanjaya
schedule
14.12.2015