Вот что я сделал, чтобы "решить" это:
MaxClients 7
(на основе (1740.8Mb Memory on server - 900Mb for MySQL + other stuff) / 111Mb average usage per httpd process = 7. 5747747747747747747747747747748
)Therefore:
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 7
MaxRequestsPerChild 4000
Отключите все модули Apache, кроме authz_host_module
, log_config_module
, expires_module
, deflate_module
, setenvif_module
, mime_module
, autoindex_module
, negotiation_module
, dir_module
, alias_module
, rewrite_module
, php5_module
Удалите пакет mod_ssl
, поскольку клиент не использует https: //
что именно.
Я отчитаюсь, когда эта новая конфигурация будет работать некоторое время, чтобы посмотреть, решит ли это проблему.
Некоторое вдохновение здесь было позаимствовано из: http://www.activoinc.com/blog/2009/08/31/performance-optimized-httpd-conf-for-magento-ecommerce/ и http://www.activoinc.com/downloads/httpd.conf-magento
sed -E '/^[[:blank:]]*<description><!\[CDATA\[/s/([!?.])[^!?.<]*<a/\1 <a/' file
Это будет искать все строки, начинающиеся с точной строки <description><![CDATA[
(, возможно, перед которой стоят пробелы или табуляция ). В этих строках будет произведена замена.
Замена соответствует ограничителю предложения ([!?.]
), за которым следует любое количество символов, которые не являются не ограничителями предложения или <
, и строкой <a
. Это будет заменено первым разделителем предложения, пробелом и строкой <a
.
Я протестировал приведенную ниже команду sed, и у меня все сработало
sed "s/particulier\..*<a/particulier.<a/g" file
выход
...Something before
<description><![CDATA[Des chercheurs de l'université de Columbia à New York ont mis au point un nouveau moyen de cacher un message dans un texte sans en altérer le sens et sans dépendre d'un format de fichier particulier.<a href="https://korben.info/cacher-des-informations-dans-un-texte-grace-a-des-modifications-sur-les-caracteres.html">Passage a la news suivante</a>]]></description>
... Other news
Хотя XML — это только текстовый -формат, пытаться манипулировать им с помощью sed и/или awk — ужасная идея, потому что формат имеет так много краеугольных случаев и исключений в способах его использования, что вам действительно стоит задуматься. его как двоичный формат, который просто читается невооруженным глазом, а не как текстовый формат. Это кажется легким, пока вы на самом деле не попробуете. Короткий ответ: просто не надо.
Вместо этого я бы предложил использовать язык сценариев с библиотекой для обработки XML. Таких библиотек много. В Perl вы могли бы сделать что-то в этом роде:
#!/usr/bin/perl -wCSDA
use strict;
use warnings;
package MyFilter;
use base qw(XML::SAX::Base);
sub new {
my $class = shift;
my @args = @_;
my $self = $class->SUPER::new(@args);
$self->{indesc} = 0;
return $self;
}
sub start_element {
my $self = shift;
my $data = shift;
if ($data->{LocalName} eq "description") {
$self->{indesc} = 1;
}
return $self->SUPER::start_element($data);
}
sub end_element {
my $self = shift;
my $data = shift;
if ($data->{LocalName} eq "description") {
$self->{indesc} = 1;
}
return $self->SUPER::end_element($data);
}
sub characters {
my $self = shift;
my $data = shift;
if(($self->{indesc}) == 1) {
$data->{Data} =~ s/\.[^\.]*<a href/.<a href/;
}
return $self->SUPER::characters($data);
}
package main;
use XML::SAX::ParserFactory;
use XML::SAX::Writer;
my $writer = XML::SAX::Writer->new();
my $filter = MyFilter->new(Handler => $writer);
my $input = XML::SAX::ParserFactory->parser(Handler => $filter);
$input->parse_uri("input.xml");
Это работает следующим образом:
package MyFilter;
сигнализирует о классе, который реализует фильтр XML ::SAX :sub new
— это конструктор, который на самом деле создает только флаг $self->{indesc}
. sub start_element
вызывается каждый раз при открытии элемента XML. Мы проверяем, является ли рассматриваемый элемент элементом <description>
; если да, то устанавливаем флаг (и передаем дальнейшую обработку суперклассу ). sub end_element
вызывается каждый раз при закрытии XML-элемента. Мы проверяем, является ли рассматриваемый элемент элементом <description>
; если да, то сбрасываем флаг (и передаем дальнейшую обработку суперклассу ).sub characters
вызывается каждый раз, когда обрабатывается текст или элемент CDATA. В этом подразделе мы проверяем, установлен ли флаг; если это так, мы применяем регулярное выражение к передаваемым данным, чтобы любое неполное предложение отбрасывалось (, только считая с точки; улучшение этого регулярного выражения оставлено читателю в качестве упражнения; -П)main
содержит начальную точку скрипта :XML::SAX::Writer
(, который просто выводит проанализированные XML-данные, которые снова передаются в формате XML, на стандартный вывод по умолчанию ), подключает их к нашему фильтру (, поэтому XML-данные передаются в модуль записи содержит данные XML, полученные фильтром с удаленными неполными предложениями ), и подключает фильтр к синтаксическому анализатору XML, созданному с помощью XML::SAX::ParserFactory
. input.xml
). Если это кажется сложным, то это потому, что так оно и есть. Если у вас есть выбор, просто откажитесь от XML и используйте вместо этого что-то более простое, например JSON или YAML;-)