我更改了应用程序的配置并将新代码部署到生产服务器.由于应用程序不解析配置文件并使用预编译类,我需要更新缓存文件.
有app/console cache:warmup
和app/console cache:clear
命令.但是在调用这些命令后缓存没有更新,所以我不得不手动删除app/cache文件夹.
手动删除是非常危险的操作,因为它不是原子的,所以我可以在请求期间删除部分缓存,这可能会导致致命错误.
我该如何重新加载缓存?
使用PHP库类,我想将它的所有公共函数包装在一个子类中......有些内容如下:
class BaseClass
{
function do_something()
{
some;
stuff;
}
function do_something_else()
{
other;
stuff;
}
/*
* 20-or-so other functions here!
*/
}
class SubClass extends BaseClass
{
function magicalOverrideEveryone()
{
stuff-to-do-before; // i.e. Display header
call_original_function(); // i.e. Display otherwise-undecorated content
stuff-to-do-after; // i.e. Display footer
}
}
Run Code Online (Sandbox Code Playgroud)
如果有一个[有点优雅/干净]的方法在一个地方完成它,我宁愿不要用相同的包装代码覆盖每个超类方法.
这可能吗?我怀疑我在这里进行元编程,甚至不知道PHP是否提供了这样的野兽,但我想问...
我们有几台AD服务器,它们之间建立了森林信任,因此来自不同域的Windows用户可以访问受限资源.假设我们有domainA.com和domainB.com,因此域domainB.com中的任何用户都可以登录domainA.com上的资源.出于安全原因,管理员禁用对LDAP服务器的匿名访问.
现在,我们需要在OpenLDAP客户端的帮助下,在PHP代码中列出所有LDAP服务器的所有用户.以下是获取domainB.com所有用户信息的PHP代码
define('USER', 'user@domainA.com'); // User from domainA.com here
$ldap = ldap_connect('domainB.com') or die('Bad connection');
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);
ldap_bind($ldap, USER, PASS) or die('Cannot bind');
Run Code Online (Sandbox Code Playgroud)
我的脚本因ldap错误"49无效凭据"消息"无法绑定"而死亡.AD的其他信息:
80090308:LdapErr:DSID-0C0903A9,评论:AcceptSecurityContext错误,数据52e,v1db1
我认为问题在于简单的身份验证机制,因为当我在Ldap Administrator客户端中使用GSS Negotiate身份验证时,user@domainA.com的凭据一切正常.
如何使用user@domainA.com的凭据在domainB.com上成功绑定?
使用SASL DIGEST-MD5进行UPD1身份验证
ldap_sasl_bind ( $ldap, '', $pass, 'DIGEST-MD5', null, 'user@domainA.com');
Run Code Online (Sandbox Code Playgroud)
来自AD的日志:
The computer attempted to validate the credentials for an account. Authentication Package: WDigest Logon Account: user Source Workstation: DOMAINA Error Code: 0xc000006a An account failed to log on. Subject: Security ID: NULL SID Account …
我对我正在为自定义框架开发的事件系统有所了解.
想象一下像这样的伪函数.
class Test
{
public function hi()
{
Event::add(__FUNCTION__ . 'is about to run.');
return "hi";
}
}
Run Code Online (Sandbox Code Playgroud)
想象一下,你需要为更多功能做同样的事情.(也许您想记录在运行时运行的函数,并希望将它们记录在单独的文件中.)
而不是这样做并手动将事件添加到函数中,我们可以做这样的事情吗?
class Test
{
public function hi()
{
return "hi";
}
}
// events.php (It's a pseudo code so may not work.)
// Imagine extend's purpose is to inject codes into target function
Event::bind('on', $className, $methodName, function() use ($className, $methodName)
{
return $className->$methodName->extend('before', Event::add(__FUNCTION__ . 'is about to run.'));
});
Run Code Online (Sandbox Code Playgroud)
我们的想法是注入hi()
内部的函数Test class
并注入我们通过extend
外部传递的任何函数.'before'
意味着注射必须在目标函数的第一线. …
有一个名为Go的框架!面向方面的PHP框架
它是用纯PHP制作的,不需要任何PECL扩展和DI容器就可以工作.
还可以与任何现有的PHP框架和库集成(使用或不使用其他配置).
并且没有切入点的运行时检查,没有运行时注释解析,没有eval和__call方法,没有慢代理和call_user_func_array().快速引导过程(2-20ms)和建议调用.
所以我印象非常深刻,但我想知道的是,这实际上是如何运作的?
我在这里列出的这些要点......
我查看了github和官方网站以及其他一些文章,但是找不到任何关于这是如何工作的具体信息(一般情况下和具体情况).
我非常渴望知道这是如何工作的?它是如何实现的?
我想为某些类设置一个通用的包装类来拦截和操作一些方法调用.方法 - 呼叫转发,拦截,到目前为止没问题.但是经过一段时间的思考,我发现了一个问题,我没有解决方案:我在我的应用程序中使用内置的instanceof-operator.当然这将不再起作用,因为包装器不是其中类的实例.我想继续使用运算符,而不是用其他函数替换它.
有没有办法实现此问题的解决方法?这个操作符如何工作?它是否调用了我可能在包装器中覆盖的类的核心功能?
我知道这不是一个真正"干净"的解决方案来操纵这个操作符,但我认为这对我来说是最简单的解决方案.而且正如我们所知,PHP中有很多东西并不那么干净...... :-)
谢谢你的回答,本
php ×5
aop ×4
caching ×1
decorator ×1
frameworks ×1
goaop ×1
inheritance ×1
instanceof ×1
interceptor ×1
ldap ×1
oop ×1
overriding ×1
reload ×1
symfony ×1
trust ×1