我试图测试一个场景,一方面,匿名用户应该立即断开与Websocket连接的连接,另一方面,经过身份验证的用户应该保持在websocket连接中.第一种情况可以通过使用下面的代码轻松测试.身份验证过程无效.
对于会话存储,我将Cookie身份验证与数据库结合使用:Symfony PDO会话存储.它一切正常,但是当使用身份验证测试所描述的行为时,我不知道如何在测试中验证用户.作为客户端,我正在使用Pawl异步Websocket客户端.这看起来如下:
\Ratchet\Client\connect('ws://127.0.0.1:8080')->then(function($conn) {
$conn->on('message', function($msg) use ($conn) {
echo "Received: {$msg}\n";
});
$conn->send('Hello World!');
}, function ($e) {
echo "Could not connect: {$e->getMessage()}\n";
});
Run Code Online (Sandbox Code Playgroud)
我知道作为第三个参数,我可以将头信息传递给"connect"方法,但我找不到一种方法,以便在ws握手期间连接客户端并正确传递cookie.我想到了类似的东西:
这是我认为可行的理论,但用户总是在websocket方面保持匿名.这里到目前为止的理论代码:
// ...
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
class WebsocketTest extends WebTestCase
{
static $closed;
protected function setUp()
{
self::$closed = null;
}
public function testWebsocketConnection()
{
$loop = Factory::create();
$connector = new Connector($loop);
// This user exists in database user tbl
$symfClient = $this->createSession("testuser@test.com");
$connector('ws://127.0.0.1:80', [], …Run Code Online (Sandbox Code Playgroud) 我正在尝试实现一个实时通知系统(如fb,xing,twitter ..).因此,我在构建实体之前创建了一个UML类图.展示如下:
编辑:我想到了这种方法,似乎这不是正确的方法.让我们检查下面的情况:用户U在事件E的图像中添加了注释C.如何正确存储,我的意思是EventNotification只有事件E的引用,但不在I和C上.因此我需要创建一个"EventImageNotification"类也是如此,这将是一个烂摊子.如果只有一个"通知"类并向其添加"元数据"字段,它是否是一个更好的解决方案,它存储对所有相关字段的引用?
(我以后使用OR-Mapper来实现关系).
[1]一个用户可以创建活动,例如"Silvester Party 2015".(一对多).此事件有一个仪表板,当创建者在该事件上发布内容时,用户可以订阅接收更新(ManyToMany).
[2]当用户在事件的仪表板上发布内容时,订阅的用户应该收到通知.因此,我创建了EventNotification类.用户和EventNotification之间的关系是ManyToMany.
[3]为了保持清洁,我创建了一个与Notification类型相关的AbstractNotification类.通知类型类似于name ="EventPost"和template ="用户用户在事件__event上发布了新内容".
[4]抽象类NotificationConnector为EventNotification和User(UserEventNotification)之间的映射类提供字段.我创建它们以便将来轻松扩展它,例如用户可以创建也触发事件等的书籍.然后我需要创建一个"BookNotification"和一个"UserBookNotification"类来存储这个新实体的通知.
这种方法是好的还是完全搞砸了?请告诉我您对此图表的看法:
(建立关联的箭头应该是正常的线,我使用的工具就是不能这样做).
我正在使用Symfony2来构建我的页面.当我尝试更新表单集合时(如cookbook条目" 如何嵌入表单集合 "中所述),我得到前端的索引和后端的ArrayCollection索引的冲突.
我有关系用户< - >地址(OneToMany).用户想要创建/更新/删除他的地址,因此他可以在javascript部分新地址元素的帮助下在前端添加/删除.他做了以下事情:
(1)添加新地址(索引:0)
(2)添加新地址(索引:1)并立即再次删除该地址
(3)添加新地址(索引:2).
当他点击"保存"按钮时,以下代码保存/更新用户(及其地址):
$this->em->persist($user);
$this->em->flush();
Run Code Online (Sandbox Code Playgroud)
例如,新地址可以正确地保存到数据库中.现在用户想要更新地址,例如索引0.当他现在点击保存按钮时,它用"索引0"更新地址,但同时,它再次添加带有"索引2"的地址到数据库(对象).为了更好地理解这个问题,我画了一个小插图(手工制作,对我糟糕的艺术技巧感到抱歉):
现在,我的对象/数据库中的"索引1"的地址是两倍.我知道为什么会发生这种情况,这是因为第一个"索引1"地址被映射到ArrayCollection元素"number 1",第二个被映射到"number 2"(因为前端名称"index 2").你可以说:"它只是填满了地址,直到它到达后端的前端索引".但是我该如何解决这个问题呢?
站点说明:使用ajax请求会发生此行为,因为如果您在单击"保存按钮"后重新加载页面,它将使用后端中的索引正确地重新索引前端中的地址.
我建议处理这种情况:
单击使用服务器端索引保存后重新索引前端索引.这是我的问题的明确/唯一解决方案吗?
我已经阅读了很多关于websockets的内容,并且已经在我的系统中实现了它们.这个问题是关于如何正确使用它们.我想以正确的方式实现通知和聊天系统.
对于通知,我有频道"通知/频道",对于聊天,我有频道"聊天/频道".
这两个渠道不是太"全球化"吗?假设当该网站拥有1.000.000个用户时,这意味着所有这些用户都将处于这两个渠道中.当一个通知发送给另一个特定用户时,这意味着该消息通过一个1.000.000用户订阅的频道发送.
与聊天消息相同.假设用户想要与其他用户聊天.每条消息都将通过所有用户订阅的频道,最后,由于传递的receiver_id,只有目标用户才会收到该消息.
如何正确处理通知渠道和"私人"聊天渠道?
为每个用户创建一个"子频道"(群聊和通知,EG"通知/频道/用户1")或者只是让所有用户进入一个大频道会更高效和安全吗?
我有以下sql语句,我想转换为doctrine查询生成器.目标是计算评级值1和评级值2存在多少评级.
SELECT
COUNT(CASE WHEN rating.rating = 1 THEN rating.rating END) as rat1,
COUNT(CASE WHEN rating.rating = 2 THEN rating.rating END) as rat2
FROM rating
Run Code Online (Sandbox Code Playgroud)
这个sql语句运行正常 - 但是当我尝试将它转换为Doctrine语句时,它就不再存在了.当什么都不应该被计算(因为没有对这个值的评级存在)时,它会返回一个"1"而不是0.如果没有什么可计算的,我怎么能告诉学说简单地返回一个零?我通过删除"ELSE 0"尝试了它,但后来我得到一个错误,这部分是必需的..
return $qb
->addSelect('COUNT(CASE WHEN r.rating = 1 THEN r.rating ELSE 0 END) as rat_1')
->addSelect('COUNT(CASE WHEN r.rating = 2 THEN r.rating ELSE 0 END) as rat_2')
->getQuery()
->getResult();
Run Code Online (Sandbox Code Playgroud)
问候,
"sum"不是必需的 - 例如:投票2,2,2,2,2应该返回5,因为值为2的评级被投票5次.
我试图在Windows Server 2012上运行phpdox - 但我收到错误:
PHP Version: 7.0.5 (WINNT)
PHPDox Version: 0.8.1.1
Exception: TheSeer\phpDox\Generator\TokenFileException (Code: 1)
Location: phar://D:/htdocs/AscPro/bin/phpdox-0.8.1.1.phar/phpdox/generator/pro
ject/TokenFile.php (Line 19)
File 'file:/D:/htdocs/AscPro/build/phpdox/tokens/AppBundle/AppBundle.php.xml'
not found
Run Code Online (Sandbox Code Playgroud)
我检查了位置,文件没有丢失.我在与jenkins的持续集成过程中遇到了这个问题.这很奇怪,因为同样的phpdox版本在ubuntu上对我有用.也许这与事实有关,所有程序都在"C:"上,包括詹金斯 - 但jenkins工作区是在"D:"上吗?
php continuous-integration symfony jenkins windows-server-2012-r2
假设我们想要创建私人聊天室,用户可以在这里聊天.用户可以加入多个/ x组.在每种情况下,我都需要在服务器上创建一个唯一的组,并为这些用户订阅.哪种方法是推荐/更高效的方式:
[1]在服务器端,我创建了一个Room类,并为每个群聊添加新的房间频道,例如"chats/room-asdhqk1","chats/room-fwuefhw1","chats/room-awsdhqwd2".现在,某些指定用户可以加入此频道并添加到组客户端列表中.在客户端,用户订阅了他们添加到的组渠道.
问题:当用户在x通道中时,我需要在侧载后将他订阅到这些x通道.好:可以通过群组频道名称向特定群组广播,并且订阅该频道的所有用户将自动接收消息,因为他们已订阅了js部分内的频道.
[2]每个用户都有自己的频道,例如"notifications/user-1","notifications/user-2"....... 在服务器端,我在Rooms Class(无通道)中创建组.通过将用户添加到房间列表的子列表中,可以将用户添加到特定房间.当他们彼此聊天时,服务器迭代群聊的订阅用户,并向每个用户通知频道发送消息 - 这里根本没有群组频道 - 仅针对每个用户频道.
问题:我无法轻松地广播消息,我需要遍历每个订阅用户并将消息发送到他的通知通道.另外,我不能在前端使用"发布"方法轻松地将消息发布到频道,因为用户在不同的频道中分开.
好:最后,广播方法也会这样做:迭代订阅者列表.为了发送消息,我可以轻松实现与"发布"方法相同的RPC方法 - 查找组的订阅用户并将消息发送给他们.使用这种方法,用户不需要连接到客户端的x通道,他只有一个通道可以处理所有通道.
(我知道对于第二种方法,需要一个推动器(例如zmq)).
你有什么看法?我认为第二个更好,因为我不必在客户端订阅x-channels.如果用户需要首先连接到例如500个频道,则这将不具有性能.
问候.
升级到php7后,BCryptPasswordEncoder会抛出以下错误,例如在使用FOSUserBundle标准注册页面时注册:
"在C:\ xampp\htdocs\ascentary\vendor\symfony\symfony\src\Symfony\Component\Security\Core\Encoder\BCryptPasswordEncoder.php第81行"C:不推荐使用'salt'选项来使用password_hash XAMPP\htdocs中\ testproject \供应商\贝哈特\贝哈特的\ src \贝哈特\试验工作\电话\处理器\ RuntimeCallHandler".
我已经跟踪了这个问题,问题是FOS UserManager类,它调用:
/**
* {@inheritDoc}
*/
public function updatePassword(UserInterface $user)
{
if (0 !== strlen($password = $user->getPlainPassword())) {
$encoder = $this->getEncoder($user);
$user->setPassword($encoder->encodePassword($password, $user->getSalt()));
$user->eraseCredentials();
}
}
Run Code Online (Sandbox Code Playgroud)
在这里传递$ user-> getSalt()会抛出错误,因为在php7中,不再允许您将自定义salt传递给bcrypt encoding/password_hash函数.另外,我在基本fos用户实体中看到一个问题,因为在其构造函数中,salt设置为:
$this->salt = base_convert(sha1(uniqid(mt_rand(), true)), 16, 36);
Run Code Online (Sandbox Code Playgroud)
问题:
(1)如何解决我上面发布的错误?也许覆盖了UserManager,或者是否有fos提供的解决方案?
(2)如何正确保护盐,即自动生成?
(3)是否还需要其他更新,例如更新ircmaxell lib?
我想检查具有访问控制的方法,例如,只授予具有特定角色的方法.因此,我在Symfony中了解两种方式:
当谈到单元测试时(对于我的案例phpspec,但我认为phpunit行为在这种情况下几乎相同),我想测试只有匿名用户应该能够调用方法.数字2,它工作正常.在这里我的设置:
RegistrationHandlerSpec:
class RegistrationHandlerSpec extends ObjectBehavior
{
function let(Container $container, AuthorizationCheckerInterface $auth) {
$container->get('security.authorization_checker')->willReturn($auth);
$this->setContainer($container);
}
function it_should_block_authenticated_users(AuthorizationCheckerInterface $auth)
{
$auth->isGranted("ROLE_USER")->willReturn(true);
$this->shouldThrow('Symfony\Component\Security\Core\Exception\AccessDeniedException')->during('process', array());
}
}
Run Code Online (Sandbox Code Playgroud)
在RegistrationHandler中,我有以下方法:
class RegistrationHandler
{
public function process()
{
$authorizationChecker = $this->get('security.authorization_checker');
if ($authorizationChecker->isGranted('ROLE_USER')) {
throw new AccessDeniedException();
}
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
好吧,这种方法工作正常 - 但通常情况下,我更喜欢使用1.带安全性注释(Sensio FrameworkExtraBundle),因此,它不起作用/我不知道为什么当它被编写为注释时没有触发异常:
/**
* @Security("!has_role('ROLE_USER')")
*/
public function process()
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
有没有人知道如何使用@Security注释的第一种方法使这个例子工作,这是更可读和symfony推荐的最佳做法?
我正在尝试从处于运行状态的部署中获取第一个pod(按标签过滤)- 目前我只能实现以下目标,这只会给我一个部署中的第一个 pod(按标签过滤) - 而不是肯定的一个正在运行的 pod,例如它也可能是一个终止的 pod:
kubectl get pod -l "app=myapp" -l "tier=webserver" -l "namespace=test"
-o jsonpath="{.items[0].metadata.name}"
Run Code Online (Sandbox Code Playgroud)
怎么可能
a) 仅获取“正在运行”的 pod 列表并且(在此处或在 google 上找不到任何内容)
b) 从该列表中选择第一个。(这就是我目前正在做的)
问候
更新:我已经尝试了之前在评论中发布的链接,内容如下:
kubectl get pod -l "app=ms-bp" -l "tier=webserver" -l "namespace=test"
-o json | jq -r '.items[] | select(.status.phase = "Running") | .items[0].metadata.name'
Run Code Online (Sandbox Code Playgroud)
结果是 4 个“空”——有 4 个正在运行的 Pod。
Edit2:已解决 - 见评论
我已经将php5.6升级到php7,但是zeromq扩展会产生很多问题.我在哪里可以下载php7的正确zmq.so文件?官方网站都没有提供适用于php7的版本(我正在使用apache2.4).
我遵循了以下教程:如何安装ZeroMQ.
"安装ZeroMQ"步骤正常,但当我执行命令"make"时,第二步"安装PHP绑定"失败,出现以下错误:
"/home/puser/zeromq-4.1.4/php-zmq/zmq.c:2740:2: error: too many arguments to
function 'zend_register_internal_class_ex' php_zmq_device_exception_sc_entry =
zend_register_internal_class_ex(&ce_device_exception, php_zmq_exception_sc_entry,
"ZMQException" TSRMLS_CC) ^ In file included from /usr/include/php/20151012/main/php.h:40:
0, from /home/puser/zeromq-4.1.4/php-zmq/php_zmq.h:45,from /home/puser/zeromq-4.1.4/php-zmq
/zmq.c:31:/usr/include/php/20151012/Zend/zend_API.h:290:28: note: declared here ZEND_API
zend_class_entry *zend_register_internal_class_ex(zend_class_entry *class_entry,
zend_class_entry *parent_ce);"
Run Code Online (Sandbox Code Playgroud)
使用php 5.6时,不会出现此错误.如何解决这个问题?
编辑:我发现ZeroMQ目前在这篇文章中与php7"无法正常工作":ZeroMQ安装.有没有解决方法?
php ×9
symfony ×8
websocket ×3
ratchet ×2
acl ×1
autobahn ×1
bcrypt ×1
chat ×1
collections ×1
composer-php ×1
doctrine-orm ×1
forms ×1
go ×1
javascript ×1
jenkins ×1
json ×1
kubectl ×1
kubernetes ×1
phpspec ×1
phpunit ×1
rpc ×1
sql ×1
testing ×1
ubuntu-14.04 ×1
uml ×1
zeromq ×1