我在我的项目中使用 linphone,我需要从来电中输出视频。怎么做?我试图通过属性Core
分配一个视图nativeVideoWindow
,但其中没有显示任何内容。属性videoDisplayEnabled
也videoActivationPolicy.automaticallyAccept
暴露在true
. 也许我忘了包括别的东西?
WGPavell's questions
我正在尝试通过socket.io 客户端发送消息,但在大多数情况下,服务器不会收到它(有时会收到)。客户端日志中写入以下内容:
2021-09-22 17:43:07.788557+0300 My App[46226:8969192] LOG SocketIOClient{/}: Adding handler for event: connect
2021-09-22 17:43:07.788778+0300 My App[46226:8969192] LOG SocketIOClient{/}: Adding handler for event: personal_chat_send_message
2021-09-22 17:43:07.788958+0300 My App[46226:8969192] LOG SocketIOClient{/}: Handling event: statusChange with data: [connecting, 2]
2021-09-22 17:43:07.789132+0300 My App[46226:8969192] LOG SocketIOClient{/}: Joining namespace /
2021-09-22 17:43:07.789305+0300 My App[46226:8969192] LOG SocketManager: Tried connecting socket when engine isn't open. Connecting
2021-09-22 17:43:07.789514+0300 My App[46226:8969192] LOG SocketManager: Adding engine
2021-09-22 17:43:07.789837+0300 My App[46226:8969985] LOG SocketEngine: Starting engine. Server: https://myserver
2021-09-22 17:43:07.789993+0300 My App[46226:8969985] LOG SocketEngine: Handshaking
2021-09-22 17:43:07.817286+0300 My App[46226:8969192] LOG SocketIOClient{/}: Handling event: websocketUpgrade with data: [["Upgrade": "websocket", "Sec-WebSocket-Accept": "jT5+AshZ0qfooIqPP5uMjN27daM=", "Connection": "Upgrade"]]
2021-09-22 17:43:07.817286+0300 My App[46226:8969985] LOG SocketEngine: Got message: 0{"sid":"Za4h8by7MRFk2P9uAAAE","upgrades":[],"pingInterval":25000,"pingTimeout":5000}
2021-09-22 17:43:07.817544+0300 My App[46226:8969192] LOG SocketIOClient{/}: Handling event: ping with data: []
2021-09-22 17:43:07.817545+0300 My App[46226:8969985] LOG SocketEngine: Writing ws: has data: false
2021-09-22 17:43:07.817655+0300 My App[46226:8969192] LOG SocketManager: Engine opened Connect
2021-09-22 17:43:07.817688+0300 My App[46226:8969985] LOG SocketEngineWebSocket: Sending ws: as type: 2
2021-09-22 17:43:07.817781+0300 My App[46226:8969192] LOG SocketIOClient{/}: Socket connected
2021-09-22 17:43:07.817881+0300 My App[46226:8969192] LOG SocketIOClient{/}: Handling event: statusChange with data: [connected, 3]
2021-09-22 17:43:07.817983+0300 My App[46226:8969192] LOG SocketIOClient{/}: Handling event: connect with data: ["/"]
connected
2021-09-22 17:43:07.818123+0300 My App[46226:8969192] LOG SocketIOClient{/}: Adding once handler for event: pong
2021-09-22 17:43:07.824749+0300 My App[46226:8969495] LOG SocketEngine: Got message: 3
2021-09-22 17:43:07.825082+0300 My App[46226:8969192] LOG SocketIOClient{/}: Handling event: pong with data: []
2021-09-22 17:43:07.825273+0300 My App[46226:8969192] LOG SocketIOClient{/}: Removing handler with id: 14D80209-2150-4512-9619-D3CEAB337E57
2021-09-22 17:43:07.825506+0300 My App[46226:8969192] LOG SocketIOClient{/}: Emitting: 2["personal_chat","fdsfds"], Ack: false
2021-09-22 17:43:07.825741+0300 My App[46226:8969495] LOG SocketEngine: Writing ws: 2["personal_chat","fdsfds"] has data: false
2021-09-22 17:43:07.825908+0300 My App[46226:8969495] LOG SocketEngineWebSocket: Sending ws: 2["personal_chat","fdsfds"] as type: 4
emitted
2021-09-22 17:43:07.870880+0300 My App[46226:8969985] LOG SocketEngine: Got message: 40
2021-09-22 17:43:07.871108+0300 My App[46226:8969192] LOG SocketParser: Parsing 0
2021-09-22 17:43:07.871292+0300 My App[46226:8969192] LOG SocketParser: Decoded packet as: SocketPacket {type: 0; data: []; id: -1; placeholders: 0; nsp: /}
我像这样连接到服务器:
self?.socketManager.setConfigs([.version(.two), .reconnects(true), .extraHeaders(["billing-token": token, "User-Agent": userAgent]), .forceNew(true), .compress, .forceWebsockets(true), .log(true)])
let socket = self?.socketManager.defaultSocket
socket?.on("connect", callback: { data, ack in
print("connected")
self?.socketManager.handleQueue.async {
socket?.once(clientEvent: .pong, callback: { data, ack in
socket?.emit("personal_chat", "fdsfds") {
print("emitted")
}
})
}
})
socket?.on("personal_chat_send_message", callback: { data, ack in
debugPrint(data)
})
socket?.connect()
从日志中可以看出,connected 和emitted 是输出。最初尝试不使用handleQueue,结果相似。我尝试添加延迟,然后发出更频繁地在服务器上工作,但并非总是如此。我最初尝试不指定数据(fdsfds),但什么也没发生。
在服务器上,我有以下代码:
io.on('connection', (socket) => {
let userData = socketsData.get(socket)
console.log(`${socket.id} connected`);
// ... другие события
socket.on("personal_chat", async () => {
console.log(`subscribe to ${userData.chatId} chat`);
socket.join(`personal_chat_${userData.chatId}`);
});
socket.on("disconnect", () => {
console.log(`${socket.id} disconnected`);
socketsData.delete(socket);
});
});
在控制台中,来自服务器的以下输出:
Sep 22 18:01:40 clickhouse-lk node[11900]: F0S-22mkUan2Hw_gAAAF connected
Sep 22 18:01:41 clickhouse-lk node[11900]: F0S-22mkUan2Hw_gAAAF disconnected
Sep 22 18:01:43 clickhouse-lk node[11900]: e5mEbd7zH5SeTtTsAAAG connected
Sep 22 18:01:44 clickhouse-lk node[11900]: e5mEbd7zH5SeTtTsAAAG disconnected
Sep 22 18:01:45 clickhouse-lk node[11900]: dAF09biIm0s7YxXgAAAH connected
Sep 22 18:01:48 clickhouse-lk node[11900]: dAF09biIm0s7YxXgAAAH disconnected
如您所见,我尝试了几次发送发射,但没有任何东西到达服务器。我尝试从 Web 客户端执行此操作,一切都完美地在那里发出。可能是什么问题以及如何解决?
需要以下内容:创建一个包含 Picker 块的下拉列表 (emoji-mart-vue)
一切都适用于这段代码:
<b-dropdown variant="secondary" no-caret right class="emoji-dropdown">
<template #button-content>
<i class="far fa-smile-beam"></i>
</template>
<Picker :data="emojiIndex" set="apple" @select="pickEmoji" title="Выберите эмодзи" emoji="grinning" emojiTooltip :i18n="emojiPickerI18n" @click.prevent></Picker>
</b-dropdown>
但有一件事:当你点击任何表情符号时,下拉菜单会关闭。你怎么能确保这不会发生?同时,保留下拉行为的其余部分(当您单击它或调用它的按钮时,它被隐藏了)。
PS 正如您在上面的代码中看到的那样,我尝试了 @click.prevent 和其他事件修饰符,但没有达到预期的效果
我正在尝试通过 RxAlamofire 上传文件,但 XCode 抛出错误Type of expression is ambiguous without more context
。如何解决?
RxAlamofire.upload(multipartFormData: {multipartFormData in
var i = 0
for (title, image) in images {
if let imageData = image.jpegData(compressionQuality: 0.9) {
multipartFormData.append(imageData, withName: title, fileName: "\(i).jpg", mimeType: "image/jpg")
}
i += 1
}
}, to: url, method: .post, headers: headers).responseData()
对于 UITableView,如果不指定footerView
,默认情况下,未填充的空间由空单元格填充。我需要用纯色背景填充空闲空间,而不是单元格。怎么做?即如果table的内容小于table view,那么就需要用某种颜色填充剩余的空间到屏幕的下边缘。
有一个常规身份验证器form_login
和一个自定义身份验证器,用于通过标头中的密钥进行授权。通过第二个身份验证器进行授权时,会创建一个会话,并且每次请求都会发生这种情况。如果在 security.yaml 中设置stateless: true
,那么它不会让用户通过form_login
身份验证器。如何确保只有在通过 API 密钥授权时才保存会话?
安全.yaml:
security:
enable_authenticator_manager: true
encoders:
App\Entity\User:
algorithm: auto
providers:
app_user_provider:
entity:
class: App\Entity\User
property: username
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
lazy: true
provider: app_user_provider
form_login:
login_path: app_login
check_path: app_login
default_target_path: /
custom_authenticators:
- App\Security\TokenAuthenticator
entry_point: form_login
logout:
path: app_logout
为 保存form_login
和删除会话很重要TokenAuthenticator
,因为 可以以不同的方式访问端点。验证器是根据这篇文章制作的。
有一个实体用户:用户名、角色(json)等。
有一个实体预约:patient_id、doctor_id 等。
我需要进行这样的查询以返回所有唯一用户,其中医生 ID = 所需的用户。由于角色字段,DISTINCT 在这种情况下不合适。如何提出请求?
我以我的情况为例:Appointment 中有 3 条记录具有相同的医生 ID 和患者 ID。当通过inner join Appointment 进行用户选择时,请求后返回3次患者,打破了分页和总数的输出。
$pageQb = $this->createQueryBuilder('u');
$pageQb->select('count(u.id)');
$qb = $this->createQueryBuilder('u');
$qb->join('u.appointments', 'a')
->andWhere("a.doctor = :doctor")
->setParameter("doctor", $searchParams['doctor']);
$pageQb->join('u.appointments', 'a')
->andWhere("a.doctor = :doctor")
->setParameter("doctor", $searchParams['doctor']);
$qb->setFirstResult(($page - 1) * $pageSize);
$qb->setMaxResults($pageSize);
try {
$totalEntities = (int) $pageQb->getQuery()->getSingleScalarResult();
$totalPages = ceil($totalEntities / $pageSize);
} catch (NoResultException $e) {
$totalEntities = 0;
$totalPages = 0;
} catch (NonUniqueResultException $e) {
$totalEntities = 0;
$totalPages = 0;
}
return [$totalEntities, $totalPages, $qb->getQuery()->getResult()];
pageQb->getQuery()->getSingleScalarResult() 会返回 3,$qb->getQuery()->getResult() 会返回一个唯一记录,但是如果你在数据库中重复这个查询,那么也会有 3 个记录. 这也会影响分页。
医生和病人是Entity User,ManyToOne关系。
UPD:总计,我现在选择了以下选项:
$qb = $this->createQueryBuilder('u');
$qb->join('u.appointments', 'a')
->andWhere("a.doctor = :doctor")
->setParameter("doctor", $searchParams['doctor']);
$qb->setFirstResult(($page - 1) * $pageSize);
$qb->setMaxResults($pageSize);
$paginator = new Paginator($qb, false);
$totalEntities = $paginator->count();
$totalPages = (int) ceil($totalEntities / $pageSize);
$users = [];
foreach ($paginator as $user) {
$users[] = $user;
}
return [$totalEntities, $totalPages, $users];
Windows上有一个Aquarius终端和一个带有JS脚本的网页,在终端设备的屏幕上打开。在浏览器中打开时,有几个 BUT:
- 打印页面。当您尝试打印时,会出现一个窗口,要求您确认打印。无论有无此窗口,都需要打印。
- 全屏模式。是的,您可以使用 F11 将浏览器窗口扩展到全屏。但是在这种情况下,当您将光标移动到屏幕顶部时,会出现一个令人不快的十字,您可以使用它退出此模式,然后开始做坏事。理论上,您可以“感觉到”传感器上的这个区域,从而退出该模式。我想避免这种情况。
解决上述问题的可能方案是什么?
有必要创造一个像谷歌那样的机会 - 发送反馈,特别是带有页面截图的部分。尝试使用 html2canvas 和 dom-to-image,因为它们不适用于 svg(我在我的应用程序中使用 fontawesome)。如果没有 svg,它也不会在任何地方创建屏幕截图,它经常会抛出Uncaught (in promise)错误。
Event {isTrusted: true, type: "error", target: null, currentTarget: null, eventPhase: 0, …}
isTrusted: true
type: "error"
target: null
currentTarget: null
eventPhase: 0
bubbles: false
cancelable: false
defaultPrevented: false
composed: false
timeStamp: 8231.119999999919
srcElement: null
returnValue: true
cancelBubble: false
path: [img]
以后我一般都不需要标签了,比如谷歌,只要对页面进行截图+根据用户的要求裁剪图片就够了。在我的情况下可以做什么?
以防万一,创建屏幕截图的一段代码,但它不太可能说什么,我仍在探索可能性:
$("#bugReportTakeScreenshot").click(function() {
domtoimage.toPng($(".wrapper")[0]).then(function (dataUrl) {
let image = new Image();
image.src = dataUrl;
$("#bugReportModalBlock").append(image);
});
});
有时查询时,时不时会出现如下错误:
[2020-04-23 11:41:22] request.CRITICAL:未捕获的 PHP 异常 Symfony\Component\ErrorHandler\Error\OutOfMemoryError:“错误:允许的 134217728 字节内存大小已用尽(尝试分配 17844416 字节)”在 /home /wgpavell/symfony-blog/vendor/symfony/cache/Traits/FilesystemTrait.php line 100 {"exception":"[object] (Symfony\Component\ErrorHandler\Error\OutOfMemoryError(code: 0): Error: Allowed memory size在 /home/wgpavell/symfony-blog/vendor/symfony/cache/Traits/FilesystemTrait.php:100)"} [] 中用尽了 134217728 个字节(尝试分配 17844416 个字节)
在极少数情况下,误差的变化如下:
[2020-04-24 16:56:25] request.CRITICAL:未捕获的 PHP 异常 Symfony\Component\ErrorHandler\Error\OutOfMemoryError:“错误:允许的内存大小为 134217728 字节已用尽(尝试分配 10489856 字节)”在 /home /wgpavell/symfony-blog/vendor/graze/guzzle-jsonrpc/src/functions.php 第 82 行 {"exception":"[object] (Symfony\Component\ErrorHandler\Error\OutOfMemoryError(code: 0): Error: Allowed在 /home/wgpavell/symfony-blog/vendor/graze/guzzle-jsonrpc/src/functions.php:82)"} [] 中耗尽 134217728 字节的内存大小(尝试分配 10489856 字节)
我不明白出了什么问题,但我怀疑这段代码在我的案例中:
$cache = new FilesystemAdapter();
$maps = $cache->get('zabbix_maps', function (ItemInterface $item) use ($client) {
$item->expiresAfter(3600);
$response = $client->request('map.get', [
"output" => "extend",
"selectSelements" => "extend",
]);
return $response->getResult();
});
它可以与什么连接以及如何治愈?我使用 Symfony 4.4.5 作为ZabbixClient客户端。我需要从zabbix获取关于地图的数据,但是每次请求都需要很长时间才能将它们拉出来,所以我将数据缓存了一个小时。也许我做错了?该错误很少发生,频率为每天 2-4 次。
我想向应用程序添加建立到坐标的路线的能力,以允许用户选择应用程序。我遇到了一个问题:我需要获取最新的应用程序图标,例如 Yandex.Maps,以便在窗口中显示它们。问题:如何获取另一个应用程序的当前图标?
在 framework.yaml 文件中为会话设置了以下设置:
session:
handler_id: session.handler.native_file
save_path: '%kernel.project_dir%/var/sessions/%kernel.environment%'
name: 'prod112'
cookie_secure: auto
cookie_samesite: lax
cookie_lifetime: 2592000
尽管生命周期是 1 个月,但大约半小时或一小时后它就会被扔出帐户,您必须重新授权。同时,正常写入具有此名称的 cookie 并为其指明适当的句点:
prod112 u0cnla99lbgkaaeop2m870k9k4 192.168.117.39 / 2019-12-18T20:12:35.888Z 33 ✓ ✓ Lax
同时在开发服务器上也有类似的设置:
session:
handler_id: session.handler.native_file
save_path: '%kernel.project_dir%/var/sessions/%kernel.environment%'
name: 'dev'
cookie_secure: auto
cookie_samesite: lax
cookie_lifetime: 2592000
那里没有这样的问题。会话肯定会写入 dev 文件夹,写入 prod,但是在 prod 上,授权会在 30-60 分钟内重置,并且需要您再次登录。如何解决这个问题?
我需要包含 bootstrap 4,使其在所有包含的 javascript 文件中都可见。实际上,有一个 app.js 文件,其中连接了引导程序:
const $ = require('jquery');
global.$ = global.jQuery = $;
require('bootstrap');
它是用 webpack 编写的,在我需要的 html 文件中调用:
{{ encore_entry_link_tags('app') }}
Bootstrap 启动,所有组件都工作,甚至插件(如 Modal、Tooltip 等),但仅限于 INSIDE app.js。我需要让这些插件对其他 JavaScript 文件可见。
我试图在我需要的文件中单独连接必要的插件:
require('bootstrap/js/dist/tooltip');
require('bootstrap/js/dist/modal');
但是通过这种方式,与这些组件相关的所有功能都开始工作两次,这看起来很不愉快,有时甚至很烦人。如何包含引导程序,以便组件的功能不重复并且在所有 JS 文件中可见?
这是 Tooltip 插件示例的错误:
jQuery.Deferred exception: $(...).tooltip is not a function TypeError: $(...).tooltip is not a function
at HTMLDocument.<anonymous> (https://192.168.117.39:8000/build/aboninfo.f622ec28.js:225:45)
at mightThrow (https://192.168.117.39:8000/build/aboninfo.f622ec28.js:5833:29)
at process (https://192.168.117.39:8000/build/aboninfo.f622ec28.js:5901:12) undefined
模态窗口事件(模态插件)根本不触发,也没有反应:
$("#inetSessionListModal").on('show.bs.modal', function(e) {
...
});
在 Webpack 中包含文件:
.addEntry('app', './assets/js/app.js')
.addEntry('aboninfo', './assets/js/aboninfo.js')
在模板本身中:
{% block javascripts %}
{{ parent() }} // Здесь подключается app.js
{{ encore_entry_script_tags('aboninfo') }}
{% endblock %}
我遇到了以下问题:当我更改用户的权限/角色时,他需要重新登录到他的帐户以便更新。有没有办法摆脱这个烦人的功能?
出现了以下问题。有一个按钮,当单击该按钮时,会向控制器发送 AJAX 请求。它执行的任务通常需要很长时间。
...
$process = new Process("...");
$process->start();
...
进程异步启动的事实start
是可以理解的。但问题是:如何监控进程的状态,如何知道它已经完成?另外,我想防止用户发送这样的请求,重新加载页面,并再次发送相同的请求,即如果进程已经在后台运行,则使按钮不可用。您还需要以某种方式发现该过程已结束并取消阻止该按钮。实际上,如何实现呢?
可选: 此外,最好从外部控制这些进程,例如,在单独的页面上跟踪它们的状态,如果需要,可以切断这些进程。在 symfony 中是否可以从另一个控制器访问在一个控制器中运行的进程?