我们的团队正在开发WordPress插件,并在几个独立的服务器上提供托管实例.我们的WordPress安装由Git管理,所有服务器都部署了相同的源和WordPress设置,只有数据库中的域和实际数据不同.对于每个安装,MySql都在同一主机上运行.WordPress专门在每台服务器上运行.
但是,在Windows Server 2008 RC2上部署此设置后,我们发现与其他服务器相比,性能差异显着:页面生成时间从平均值上升.使用PHP生成的页面为400ms到4000-5000ms.对于Apache提供的静态资源,速度与linux上的速度大致相同.
所以我们采取了一些措施来缩小问题范围:
经过一些分析后,我们很快发现我们的Windows机器上正则表达式的评估速度非常慢.评估10.000正则表达式(preg_match)在Linux上大约需要90ms,在Windows上需要3000ms.
下面提供了分析,系统测试和配置细节.我们不想优化这个脚本(我们知道该怎么做).我们希望脚本在Windows上以与Linux上相同的速度运行(给出与opcache/...相同的设置).无需优化脚本的内存占用.
更新:一段时间后,系统似乎耗尽内存,触发内存异常和随机分配.有关详细信息,请参阅下方.重启Apache/PHP现在解决了这个问题.
跟踪_get_browser是:
File (called from)
require wp-blog-header.php (index.php:17)
wp (wp-blog-header.php:14)
WP->main (functions.php:808)
php::do_action_ref_array (class-wp.php:616)
php::call_user_func_array (wp-includes/plugin:507)
wp_slimstat::slimtrack (php::internal (507))
wp_slimstat::_get_browser (wp-slimstat.php:385)
Run Code Online (Sandbox Code Playgroud)
更新2:某些原因我不记得我们回到激活PHP作为我们服务器上的Apache模块(同样会导致性能不佳).但今天他们跑得非常快(约1秒/请求).添加Opcache可以将其降低到~400ms/req.Apache/PHP/Windows保持不变.
1)分析结果
在所有机器上使用XDebug进行分析.通常我们只收集了一些运行 - 这些足以显示大部分时间(50%以上)花费的位置:[get_browser][1]WordPress插件的方法wp-slimstats:
protected static function _get_browser(){
// Load cache
@include_once(plugin_dir_path( __FILE__ ).'databases/browscap.php');
// browscap.php contains $slimstat_patterns and $slimstat_browsers
$browser = array('browser' => 'Default Browser', 'version' => '1', 'platform' => 'unknown', 'css_version' => 1, …Run Code Online (Sandbox Code Playgroud) 有没有一种方法来模拟/重写一个内置的功能shell_exec在PHPUnit.我知道Mockery并且我不能使用除了之外的其他库PHPUnit.我已经尝试了超过3小时而且某个地方卡住了.任何指针/链接都将受到高度赞赏.我在用Zend-framework2
我有一个包含三列的数据框:Id,Date并Value希望按平均降采样:获取接下来的20行,Value从这20行中构建平均值,然后将其添加到具有相同结构的新数据框中。Date应该是20行的第一个值。
我以这种方式尝试过(可能太糟糕了:):
resample.downsample <- function(data, by=20)
{
i <- 0
nmax <- nrow(data)
means <- c()
while(i < nmax)
{
means <- c(means, mean(subset(data, Id > i & Id <= i+by)$Value))
i <- i+by
}
return (
data.frame(
Id = seq(1, length.out=(nmax/by), by=1),
Date = seq(startDate, length.out=(nmax/by), by=(1/by)),
Value = means
)
)
}
Run Code Online (Sandbox Code Playgroud)
这适用于小型数据集,但可以在我的真实数据集(〜4000000行)上永久运行。任何想法如何优化此功能?
样本数据(输入,输出应具有相同的结构,类:整数,数字,POSIXct / POSIXt):
Value Id Date
1 125 1 2011-06-30 22:41:50
2 127 2 2011-06-30 …Run Code Online (Sandbox Code Playgroud) 我正在尝试将 Socialite 包用于 laravel,我想知道如何将附加参数传递给回调 url。似乎 OAuth 允许额外的参数,但我还没有找到任何关于如何传递它们的 laravel 解决方案。目前我的方法看起来像这样
public function login($provider)
{
return Socialite::with($provider)->redirect();
}
public function callback(SocialAccountService $service, $provider)
{
$driver = Socialite::driver($provider);
$user = $service->createOrGetUser($driver, $provider);
$this->auth()->login($user, true);
return redirect()->intended('/');
}
Run Code Online (Sandbox Code Playgroud)
假设我想$user_role在我的回调方法中获取变量。我如何通过它?
这不是关于EasyHook的特定功能,而是关于一般的挂钩.我想用这个签名挂钩一个函数:
public: int __thiscall Connection_t::Send(unsigned int,unsigned int,void const *)
Run Code Online (Sandbox Code Playgroud)
这显然是非托管代码,我正在尝试使用EasyHook将其与我的托管c#代码挂钩.但我认为这不是EasyHook导致问题,但我知道调用约定等...
这就是我如何定义DllImport并删除:
public static int Send_Hooked(uint connection, uint size, IntPtr pDataBlock)
{
return Send(connection, size, pDataBlock);
}
[DllImport("Connection.dll", EntryPoint = "?Send@Connection_t@@QAEHIIPBX@Z", CallingConvention = CallingConvention.ThisCall)]
static extern int Send(uint connection, uint size, IntPtr pDataBlock);
[UnmanagedFunctionPointer(CallingConvention.ThisCall, CharSet = CharSet.Unicode, SetLastError = true)]
delegate int DSend(uint connection, uint size, IntPtr pDataBlock);
Run Code Online (Sandbox Code Playgroud)
但是一旦我注入钩子,钩住的程序就会继续崩溃 - 没什么大惊喜.我认为它是调用约定的问题,并且我的钩子函数以某种方式干扰了钩子程序的堆栈.
所以我看看另一个项目谁挂钩相同的功能,但在c ++中弯路(挂钩部分):
Func = (int (__stdcall *)(unsigned int, unsigned short, void const ))::GetProcAddress(::GetModuleHandle("Connection.dll"), "?Send@Connection_t@@QAEHIIPBX@Z");
PVOID DetourPtr;
PVOID TargetPtr;
DetourTransactionBegin();
DetourAttachEx(&Func, …Run Code Online (Sandbox Code Playgroud)