小编And*_*ton的帖子

Gearman与多个服务器和PHP工作者

我遇到了在多台服务器上运行的齿轮工人的问题,我似乎无法解决.

当工作服务器脱机而不是取消工作进程时,会发生此问题,并导致所有其他工作进程出错并失败.

只有1个客户和2个工人的示例 -

客户:

$client = new GearmanClient ();

$client->addServer ('192.168.1.200');
$client->addServer ('192.168.1.201');

$job = $client->do ('generate_tile', serialize ($arrData));
Run Code Online (Sandbox Code Playgroud)

工人:

$worker = new GearmanWorker ();

$worker->addServer ('192.168.1.200');
$worker->addServer ('192.168.1.201');

$worker->addFunction ('generate_tile', 'generate_tile');

while (1)
{
    if (!$worker->work ())
    {

        switch ($worker->returnCode ())
        {

            default:
                echo "Error: " . $worker->returnCode () . ': ' . $worker->error () . "\n";
                break;

        }

    }
}

function generate_tile ($job) { ... }
Run Code Online (Sandbox Code Playgroud)

工作器代码在两个单独的服务器上运行.当每个服务器启动并运行时,两个工作程序都按预期执行作业.当其中一个工作进程被取消时,另一个工作程序按预期执行所有作业.

但是,当具有已取消的工作进程的服务器关闭并完全脱机时,对客户端脚本的请求将挂起,并且剩余的工作进程不会获取任何作业.

我从剩余的工作进程中得到以下一组错误:

Error: 46: gearman_con_wait:timeout reached
Error: 46: gearman_con_wait:timeout reached …
Run Code Online (Sandbox Code Playgroud)

php gearman

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

Laravel/Eloquent模型属性可见性

以前我使用的ORM已经将数据库列直接映射到类属性,这允许您具有特定的属性可见性,就像您通常会限制对某些属性(例如密码)的访问一样.

有了Eloquent,我似乎无法复制这个,因为数据库列被映射到不包含可见性的内部属性数组.

我的愿望是将访问用户密码的范围仅限于对象即私有.

设置具有可见性的类属性不起作用,因为此属性超出了Eloquent模型属性的范围,因此该属性未映射到列.

Eloquent $ hidden和$ guarded属性不起作用,因为它们处理大量输出(toArray,toJSON)和质量赋值而不是直接赋值.

我试图使用accessors/mutators(getters/setters)来实现这一目标,结果不一致.

指定访问器上的可见性不起作用,因为调用的访问器方法(例如getPasswordAttribute)是从Eloquent\Model-> getAttribute方法调用的,因此public/protected将始终有效,并且private将始终失败,无论它访问的属性在何处从.

然而,有效的是停止Eloquent访问器完全返回属性,因此对$ user-> password或$ user-> getAttribute('password')的任何请求都会失败,然后有一个单独的方法,其中定义了可见性以便返回直接来自Eloquent属性数组的属性仅在允许的范围内

/**
 * Return password string only for private scope
 * @return string
 */

private function getPassword ()
{
    return $this->attributes['password'];
}

/**
 * Don't return password with accessor
 * @param string $password Password
 * @return void
 * @throws Exception
 */

public function getPasswordAttribute ($password)
{
    throw new Exception ('Password access denied');
}
Run Code Online (Sandbox Code Playgroud)

对于任何想要setter方法可见性的人来说,这种方法也适用于mutators(setter).

这看起来是否正确或是否有更好的"Laravel-Approved"处理方式?:)

php visibility accessor laravel eloquent

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

标签 统计

php ×2

accessor ×1

eloquent ×1

gearman ×1

laravel ×1

visibility ×1