小编Fge*_*Fge的帖子

PHP因子30从Linux到Windows的性能差异

我们的团队正在开发WordPress插件,并在几个独立的服务器上提供托管实例.我们的WordPress安装由Git管理,所有服务器都部署了相同的源和WordPress设置,只有数据库中的域和实际数据不同.对于每个安装,MySql都在同一主机上运行.WordPress专门在每台服务器上运行.

但是,在Windows Server 2008 RC2上部署此设置后,我们发现与其他服务器相比,性能差异显着:页面生成时间从平均值上升.使用PHP生成的页面为400ms到4000-5000ms.对于Apache提供的静态资源,速度与linux上的速度大致相同.

所以我们采取了一些措施来缩小问题范围:

  1. 确保没有运行的防病毒软件或其他Windows域内容干扰
  2. 收集分析数据以在脚本执行期间识别时间杀手
  3. 测试不同的服务器和硬件设置
  4. 仔细检查Apache和PHP配置是否存在明显的配置错误

经过一些分析后,我们很快发现我们的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)

php linux windows wordpress performance

37
推荐指数
1
解决办法
2万
查看次数

PhpUnit模拟内置函数

有没有一种方法来模拟/重写一个内置的功能shell_execPHPUnit.我知道Mockery并且我不能使用除了之外的其他库PHPUnit.我已经尝试了超过3小时而且某个地方卡住了.任何指针/链接都将受到高度赞赏.我在用Zend-framework2

php phpunit mocking

5
推荐指数
2
解决办法
3073
查看次数

n行平均值

我有一个包含三列的数据框:IdDateValue希望按平均降采样:获取接下来的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)

r

4
推荐指数
1
解决办法
2万
查看次数

向laravel的socialite包中的回调uri发送附加参数

我正在尝试将 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在我的回调方法中获取变量。我如何通过它?

php laravel

2
推荐指数
2
解决办法
7544
查看次数

非托管函数挂钩,堆栈/寄存器问题与调用约定?

这不是关于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)

c# assembly hook detours calling-convention

1
推荐指数
1
解决办法
1789
查看次数