我有一个脚本,用一个字符串($ content)构建我的网页,然后将其回显给用户.
我的脚本看起来像这样:
$time1= microtime(true);
$content = create_content();
$content_time=(microtime(true)-$time1)
$time = microtime(true);
echo $content;
$echo_time = (microtime(true)-$time);
Run Code Online (Sandbox Code Playgroud)
现在$ content_time总是低于0.5s,所以没问题.然而,每天几次$ echo_time远远超过一秒,甚至可以达到15秒.内容不是很大,大约10-20kb,发生这种情况的时间是完全随机的,所以它不是在忙碌的时候,甚至发生在半夜.
有人知道那可能是什么吗?
编辑该站点托管在(远程)专用服务器上,仅托管此站点.有一个数据库涉及,但就像我说$ content_time远低于1秒,所以这个功能的作用不能是延迟.
当我的网站时间超过一定值(比如5s)时,我会记录下来.甚至Googlebots似乎有时会遇到这些问题,所以我认为他们不会使用拨号连接:)
有没有人有PHP QuickHash的经验(http://php.net/manual/en/book.quickhash.php)?
一些早期测试显示大型阵列的内存使用量有很大改进.一个包含1M项目的数组需要226mb一个普通数组,而只有41mb使用QuickHash,速度大致相同.
但是我几乎找不到人们在生产环境中实际使用它的故事,所以我很想知道是否有任何理由不在生产中使用它.
我有这样的表结构:
CREATE TABLE `test` (
`a` tinyint(3) unsigned DEFAULT 0,
`b` tinyint(3) unsigned DEFAULT 0,
`c` tinyint(3) unsigned DEFAULT 0,
`d` tinyint(3) unsigned DEFAULT 0,
`e` tinyint(3) unsigned DEFAULT 0
);
Run Code Online (Sandbox Code Playgroud)
这有大约30列,其中一些列的值为0-200(a,b),有些列只有5个值(0,1,2,3,4)(列cd).有aprox.表中有120k行.
要显示每行的项目数,我对每列使用查询:
select a, count(*) FROM test group by a;
select b, count(*) FROM test group by b;
select c, count(*) FROM test group by c;
select d, count(*) FROM test group by d;
select e, count(*) FROM test group by e;
Run Code Online (Sandbox Code Playgroud)
这样做的问题是它将触发30个查询(每列一个)并且每次基本上都会遍历同一组数据.
有一个更好的方法吗?
我已尝试使用GROUP BY WITH ROLLUP但这导致了一个庞大的结果集,它比每个单独的查询处理得慢.
您可以在SQLfiddle上查看选择的数据: …
我有这样一张桌子:
CREATE TABLE IF NOT EXISTS `table_test` (
`id` mediumint(8) unsigned NOT NULL,
`country` enum('AF','AX','AL') DEFAULT NULL,
`number` tinyint(3) unsigned DEFAULT NULL,
`sort_order` double unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `country` (`country`),
KEY `id` (`id`,`country`)
) ENGINE=MEMORY DEFAULT CHARSET=latin1;
Run Code Online (Sandbox Code Playgroud)
我有一个表,我更改了默认顺序,如:
ALTER TABLE test_table ORDER BY sort_order ASC;
Run Code Online (Sandbox Code Playgroud)
此表永远不会更新,并且在其生命周期中不会删除或添加任何记录.如果我使用以下查询,这一切似乎都有效:
SELECT * FROM test_table LIMIT 10
Run Code Online (Sandbox Code Playgroud)
它以正确的顺序返回10条记录.
即使我使用:
SELECT * FROM test_table WHERE num=3
Run Code Online (Sandbox Code Playgroud)
它以正确的顺序返回结果.
但如果我这样做
SELECT * FROM test_table …Run Code Online (Sandbox Code Playgroud) 所以我有这个自定义的 Dotrine 类型
命名空间 App\Doctrine\Types;
使用 Doctrine\DBAL\Platforms\AbstractPlatform;使用 Doctrine\DBAL\Types\TextType;
class MyType extends TextType
{
private $prefix='';
public function getName()
{
return 'my_type';
}
public function setPrefix(string $prefix)
{
$this->prefix=$prefix;
}
}
Run Code Online (Sandbox Code Playgroud)
我在 config/packages/doctrine.yml 中注册:
doctrine:
dbal:
types:
my_type: App\Doctrine\Types\MyType
Run Code Online (Sandbox Code Playgroud)
然后在 Kernel boot() 中我尝试向此类型添加一些参数:
public function boot() {
parent::boot();
$myType=Type::getType('my_type');
$myType->setPrefix('abc');
}
Run Code Online (Sandbox Code Playgroud)
我第一次运行该应用程序时,效果非常好。前缀是为类型设置的,可以在整个应用程序中使用。但是,第二次我遇到异常:
请求未知的列类型“加密文本”。您使用的任何 Doctrine 类型都必须使用 \Doctrine\DBAL\Types\Type::addType() 注册。您可以使用 \Doctrine\DBAL\Types\Type::getTypesMap() 获取所有已知类型的列表。如果在数据库自省期间发生此错误,那么您可能忘记了为 Doctrine 类型注册所有数据库类型。使用 AbstractPlatform#registerDoctrineTypeMapping() 或让您的自定义类型实现 Type#getMappedDatabaseTypes()。如果类型名称为空,则可能是缓存有问题或忘记了一些映射信息。
然后我将 boot() 更改为:
public function boot() {
parent::boot();
if (!Type::hasType('my_type')) {
Type::addType('my_type', 'App\Doctrine\Types\MyType');
}
$myType=Type::getType('my_type');
$myType->setPrefix('abc');
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试在字符串中查找(并替换)重复的字符串.
我的字符串可能如下所示:
Lorem ipsum dolor sit amet sit amet sit amet sit nostrud exercitation amit sit ullamco laboris nisi ut aliquip ex ea commodo consequat.
这应该成为:
Lorem ipsum dolor sit amet sit nostrud exercitation amit sit ullamco laboris nisi ut aliquip ex ea commodo consequat.
请注意,由于没有重复,因此不会删除amit sit.
或者字符串可以是这样的:
Lorem ipsum dolor sit amet()sit amet()sit amet()sit nostrud exercitation ullamco laboris nisi ut aliquip aliquip ex ea commodo consequat.
应成为:
Lorem ipsum dolor sit amet()sit nostrud exercitation ullamco laboris nisi …
我的 robots.txt 看起来像这样:
User-agent: *
Disallow: /admin
Disallow: /test
User-Agent: Googlebot
Disallow: /maps
Run Code Online (Sandbox Code Playgroud)
现在 Google 会忽略用户代理 * 部分,只遵守特定的 Googlebot 指令 (/maps)。这是正常行为吗?不应该遵守 useragent * 指令(/admin、/test)吗?
必须为每个用户代理添加每一行似乎很奇怪?
从外部来源我得到的字符串就像
array(1,2,3)
Run Code Online (Sandbox Code Playgroud)
但也有更大的阵列
array("a", "b", "c", array("1", "2", array("A", "B")), array("3", "4"), "d")
Run Code Online (Sandbox Code Playgroud)
我需要它们是php中的实际数组.我知道我可以使用eval,但由于它是不受信任的来源,我宁愿不这样做.我也无法控制外部资源.
我应该为此使用一些正则表达式(如果是这样,是什么)还是有其他方法?
php ×5
performance ×3
mysql ×2
regex ×2
arrays ×1
doctrine ×1
doctrine-orm ×1
group-by ×1
memory ×1
parsing ×1
perl ×1
robots.txt ×1
seo ×1
symfony ×1
symfony4 ×1