У меня есть бесплатное приложение, которое очень часто используется, и время от времени я получаю от 500 до 1000 одновременных пользователей.
Это приложение является настольным приложением, которое будет связываться с API моего веб-сайта для получения данных каждые 5 ~ 15 минут, а также для отправки минимальных данных о трех выбранных опциях каждые 15 минут.
Поскольку пользователи могут включать и выключать приложение по своему желанию, таймер для каждого из них может запрашивать мой API, может изменяться, и поэтому я превышаю максимальный лимит подключений, доступный для моего плана хостинга.
Не желая обновлять его по финансовым соображениям, а также потому, что на данный момент это неприбыльное приложение Я ищу другие варианты, чтобы уменьшить количество соединений и кэшировать некоторую информацию, которую можно кэшировать.
Первое, что мне пришло в голову, - это использовать FastCGI с Perl. Я уже некоторое время тестировал его, и, похоже, он прекрасно работает, но у меня возникают проблемы при его использовании:
если по какой-либо причине приложение бездействует в течение 60
сервер убивает его и на следующие несколько запросов ответит
ошибка 500, пока скрипт не будет вызван заново, что занимает около 3 + минут
(да, это занимает столько времени, что я попробовал свой код локально на моем собственном тесте
сервер, и это происходит мгновенно, поэтому я уверен, что это проблема с сервером
моей хостинговой компании, но они не хотят решать
это).
тайм-аут уничтожения, установленный на 300 и убивающий / перезапускающий
сценарий после этого периода, который приведет к выше сказанному в 1)
о возрождении сценария.
Учитывая, что я сейчас ищу альтернативы, которые не основаны на FastCGI, если таковые имеются.
Также из-за ограничений общего хоста я не могу создать своего собственного демона, и мой доступ к компиляции чего-либо очень ограничен.
Есть ли хорошие варианты, которые я могу заархивировать с помощью Perl или PHP?
Главным образом уменьшите количество открытых подключений к базе данных до минимума и все еще сможете кэшировать некоторые запросы на выборку для возврата данных ... Основной процесс приложения в любом случае заключается в вставке / обновлении данных, так что есть много места для кэширования.
Это был простой код, который я использовал для тестирования:
#!/usr/bin/perl -w
use CGI::Simple; # Can't use CGI as it doesn't clear the data for the
# next request haven't investigate it further but needed
# something working to test and using CGI::Simples was
# the fastest solution found.
use DBI;
use strict;
use warnings;
use lib qw( /home/my_user/perl_modules/lib/perl/5.10.1 );
use FCGI;
my $dbh = DBI->connect('DBI:mysql:mydatabase:mymysqlservername',
'username', 'password',
{RaiseError=>1,AutoCommit=>1}
) || die &dbError($DBI::errstr);
my $request = FCGI::Request();
while($request->Accept() >= 0)
{
my $query = new CGI::Simple;
my $action = $query->param("action");
my $id = $query->param("id");
my $server = $query->param("server");
my $ip = $ENV{'REMOTE_ADDR'};
print $query->header();
if ($action eq "exp")
{
my $sth = $dbh->prepare(qq{
INSERT INTO
my_data (id, server) VALUES (?,INET_ATON(?))
ON DUPLICATE KEY UPDATE
server = INET_ATON(?)});
my $result = $sth->execute($id, $server, $server)
|| die print($dbh->errstr);
$sth->finish;
if ($result)
{
print "1";
}
else
{
print "0";
}
}
else
{
print "0";
}
}
$dbh->disconnect || die print($DBI::errstr);
exit(0);
sub dbError
{
my ($txt_erro) = @_;
my $query = new CGI::Simple;
print $query->header();
print "$txt_erro";
exit(0);
}