Readfile从大文件中读取0字节?
我正在尝试通过readfile()发送一个大文件. 但是,没有发送到浏览器,readfile()返回0(不是 false!). 我要发送的文件是大小的4GIB,可通过php读取. 我正在设置set_time_limit(0)允许冗长的下载过程. 我试图以4K块和echo的fread()在loop的限制中发送该文件,但是下载了500-2500 MIB后,随机中止(无错误),并且从未设法完成下载. 以下测试代码 $f = '/var/www/tmp/largefile.dat'; var_dump(file_exists($f)); var_dump(is_readable($f)); var_dump(filesize($f)); $rf = readfile($f); var_dump($rf); 产生以下输出: bool(true)bool(true)int(4294967296)int(0) 使用以下命令创建了测试文件: dd
0 2023-05-29
编程技术问答社区
PHP根本没有检测到连接中止的情况
我已经阅读并深刻理解了这些: http://www.php.net/manual/manual/manual/en/features.connection.connection -handling.php http://www.php.net/manual/manual/en/function .register-shutdown-function.php 但是,我已经测试了PHP 5.1.6和5.3,并且情况无法正常工作.我观察到的是: Connection_status()始终返回true,即使客户关闭了连接. 在客户端关闭连接之后,脚本的执行仍在继续进行,即使ignore_user_abort为0 直到脚本到达结束之前,才运行使用register_shutdown_function()注册的函数.客户中止连接时不会中断脚本(因此未调用函数). 因此,基本上PHP根本无法检测到客户的断开连接. 请注意,这并不是好像ignore_user_abort设置为1
0 2023-05-27
编程技术问答社区
gdb指向错误的代码行,显示不正确的回溯。
我们可以通过在我们的源代码中有多个中止呼叫来重现这个问题.在下面的示例代码中,我们总共有四个中止呼叫,但在不同条件下,我们使用"优化标志"(-O3)编译时,我们只能看到一个中止呼叫的调试信息.因此 #include #include void level_aa(int a) { if (a == 0) abort(); if (a == 1) abort(); if (a == 2) abort(); abort(); } int main(int argc,char *argv[]) { int D; D = atoi(argv[1]); printf(" Value = %d", D); level_aa(D); return 0
2 2023-05-12
编程技术问答社区
在观察员中停止产品保存过程
我目前正在开发一个用于后端产品编辑的模块. 其目的是检索产品属于并填充所选类别列表的属性(品牌属性)的类别. 管理员必须至少选择一个类别. 我的模块按预期工作,除了我不知道管理员在编辑产品时未选择任何类别的情况. 这是工作流程 管理员在产品编辑页面中的类别选项卡中选择类别 管理员单击"保存" 我的模块"观察"并收集所有类别 - >如果有选定的类别 我的模块的观察者会做一些事情来更新品牌属性 - >其他 我的模块的观察者向管理会话添加了错误 我的模块的观察者应告诉Magento停止保存产品.但是我该怎么办? 通用问题可能是:如何将"停止保存"参数传递给观察者? 这是我的config.xml文件的示例,也是我上面解释的工作流的方法. 非常感谢您的帮助,并获得了乐趣! config.xml
4 2023-05-07
编程技术问答社区
如何检查node.js服务器中的连接是否被终止
我正在用node.js进行一些长期的民意调查 基本上,Node.js服务器接受用户的请求,然后检查一些更新.如果没有更新,它将在超时后检查它们. 但是,如果用户关闭了他的标签,或者转到另一页怎么办?就我而言,脚本继续工作. node.js中是否有办法检查或检测或捕获用户中止其请求时(关闭连接)? ? 解决方案 感谢 miroshko的和 yojimbo87的答案,我能够捕捉到"关闭"事件,但我必须进行额外的调整. 只是捕获"关闭"事件没有解决我的问题的原因是,当客户端将请求发送到node.js服务器时,如果连接仍然打开,则服务器本身将无法获取信息,直到他将某些东西发送回到客户端(据我了解 - 这是因为HTTP协议). 因此,额外的调整是不时为响应写一些东西. 另一件事阻止这种情况起作用,是我以" content-type"为"应用/json".将其更改为"文本/JavaScript",有助于不时地将"白色空间"流式传输,而无需关闭连接. 最后,我有这样的东西:
0 2023-04-24
编程技术问答社区
取消长期运行的下载
我有一个Web应用程序,该应用程序具有NGINX上的PHP服务器旁语言.通过JS,用户能够从数据库中下载由PHP动态构建的文件,该文件非常慢.因此,要接收第一个字节用于打印大约20秒.然后,随后将更多数据连续流出. php: header("Content-Disposition: attachment; filename=\"" . $filename . ".txt\""); header("Pragma: public"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Set-Cookie: fileDownload=" . $filename . "; path=/"); while (Stream::MORE_DATA == $client->receive($data)) { print $data; flush(); } 此下载是
0 2023-04-23
编程技术问答社区
如何让PHP-FPM进程在用户放弃请求时终止?(Nginx)
我知道nginx与PHP-FPM流程无关,但是如果用户流产,我更希望PHP-FPM流程死亡,因此它不会继续做不必要的事情或浪费资源.对于php-fpm/nginx,无论用户流产如何,都会发生trigger_error: 如何为PHP-FPM进行用户中止? (如果可能的话) 解决方案 这不是由PHP-FPM实现的,更多信息在这里. 设置ignore_user_abort(FALSE)仅在PHP通过套接字发送数据时,而不是在忙于计算响应时. 理想情况下,它应该在PHP-FPM中实现,但是考虑到PHP大多是单线螺纹,我认为这并不容易. 在紧急情况下,您可以杀死所有连接断裂的PHP-FPM过程.假设您在Localhost上有php-fpm:9000,这将有效: netstat -ntp | grep 127.0.0.1:9000 | grep
2 2023-04-22
编程技术问答社区
Flask中间件在中止401时导致500
我的烧瓶应用程序中有一个中间件,用于验证请求标题中的JSON Web令牌,并正在检查以验证它,以下是我的中间件类: class AuthMiddleware(object): def __init__(self, app): self.app = app def __call__(self, environ, start_response): path = environ.get('PATH_INFO') if path != '/authenticate' or path != '/token': token = environ.get('HTTP_X_ACCESS_TOKEN') verfied_token = verify_token(token) if verfied_token is False: ab
14 2023-04-21
编程技术问答社区
服务工作者的中止控制器
我有一个带有许多Protebuf图层的Leafletjs地图,这些图层使用服务工作者缓存.这很好,可以节省大量的负载时间. 我最近添加了一个中止控制器,以在更改Zoom级别以删除浏览器中的当前缩放液位图块时停止获取过程,这也节省了很多时间. 我的问题现在是,中止控制器不会对通过服务工作者服务的瓷砖作用,而是从服务器中获取瓷砖的作用.结果,我的浏览器仍在尝试从不必要的服务工作者中加载当前的缩放液位图. 以下是我正在使用的服务工作者. var cacheName = 'v1'; function updateCache(request) { return caches.open(cacheName).then(cache => { return fetch(request, { signal: request.signal }).then(response => { const resClone = response.
4 2023-04-20
编程技术问答社区
多个fetch()有一个信号,以便将它们全部中止。
我看到了另一个答案: https://stackoverflow.com/a/47250621/2809729 所以我只能使用一个信号中止多个提取请求? 解决方案 在我写这个问题时,我已经在有关如何流产的这篇文章 从正在努力实施中止的先驱者中. 是的,你可以:) 这里有一个简短的例子: async function fetchStory({ signal }={}) { const storyResponse = await fetch('/story.json', { signal }); const data = await storyResponse.json(); const chapterFetches = data.chapterUrls.map(async url => { const response = await fetch(url, { signal }); return response.text(); })
10 2023-04-20
编程技术问答社区
线程的安全例外.
当我致电Thread.Abort时,我会收到以下例外: 请求类型许可 'system.security.permissions.securitypermission,Mscorlib, 版本= 2.0.0.0,文化=中性,publicKeytoken = B77A5C561934E089' 失败. 为什么会发生这种情况? 解决方案 调用thread.abort需要CAS(代码访问安全)许可Securdermissermission \ ControlThread.这与用户的权限无关,而是由.NET CLR授予您的代码的权限. ControlThread权限被认为是"危险"许可.默认情况下,.NET 2.0中仅授予在机器上本地运行的组件.我猜想您的组件要么是从本地计算机外部加载的,要么是在托管的CLR实例(例如ASP.NET)中运行的.无论哪种方式,都有适当的机制来增加您的组件的CAS权限.如果您需要帮助,则需要更具体地说明装配方式的加载. 也就是说,使用线
4 2023-04-06
编程技术问答社区
.NET中的线程终止
我有一个线程来分析文件并对数据库进行交易呼叫,每个事务都有一个审核条目,作为其交易的一部分.呼叫thread.abort()停止文件处理有什么意义的错误?而不是到处散布丑陋的安全点? 流产通话后将关闭该文件. 解决方案 明显的问题是放弃交易的风险,这可能会导致不确定的时间(或直到超时)阻止.但是,您可以将所有 stort 乱七八糟 - 不可收复的Monitor锁,信号量等,内存泄漏等. 简而言之:除非您知道 当时它在做什么,否则尽可能努力地避免流产线程.而且,您知道它在做什么的唯一方法是,如果它已经处于已知的"安全地点"(使用您的术语) - 因此,您不妨抛出异常或以托管方式提高自己. 其他解决方案 最佳实践:仅在拆除该过程时仅中止线程. 其他解决方案 尝试thread.interrupt()迫使线程从其等待状态退出.
2 2023-04-06
编程技术问答社区
C# Threads.Abort()
如果线程正在运行一个函数func1它在其中调用另一个函数func2 ... 然后我打电话给thread.abort() 此停止func1仅 或func1和func2,所有功能func1已调用?? 谢谢 编辑:以下是更多详细信息: func1在新线程中调用,它会定期连续调用func2 ... func2仅在某些数组不是零的情况下才开始做一些工作.它完成并返回 当主管想要保存数据时,它会流产func1的线程,然后制作数组null,保存数据,然后用新数组填充数组. > 有时会增加异常,因为数组在func2中为无效. 解决方案 称此方法通常终止线程. 强调我的. 它的作用是提高 ThreadAbortException ThreadAbortException 在目标线程中.如果捕获此例外,则代码将继续执行直到达到捕获块的末端,此时例外将自动重新恢复.如果您不抓住它,它类似于普通例外 - 它会传播呼叫堆栈. 假设您没有发现异常,
0 2023-04-06
编程技术问答社区
Windows窗体应用程序,线程不会停止
我正在为线程演示使用Windows Form Application.当我单击按钮1时,它将启动线程并递归进行工作. 这里的表格不会如我预期的那样悬挂.单击按钮2时,我想停止当前正在运行的线程.但是这行不通. private void button1_Click(object sender, EventArgs e) { t = new Thread(doWork); // Kick off a new thread t.Start(); } private void button2_Click(object sender, EventArgs e) { t.Abort(); } static void
12 2023-04-05
编程技术问答社区
终止一个正在运行长查询的线程
我有一个称为其中一种方法的线程,现在此方法执行一个查询,该查询可能需要很长时间才能完成, 我想为用户提供一个选择,以便能够取消此操作(这意味着停止线程并停止查询以发布数据库). 我应该提到我正在使用.NET 4.5,SQL Server DB和C#开发WPF应用程序. 解决方案 您应该使用背景工作者,这正是您想要的. ieather从工具箱中拖放并将其拖放或在代码中创建它.它支持取消,报告进展,通知完成后通知并知道它是否正在运行. 这是一个例子. void method(){ BackgroundWorker worker = new BackgroundWorker(); worker.RunWorkerCompleted += worker_RunWorkerCompleted; worker.ProgressChanged += worker_ProgressChanged; wo
8 2023-04-05
编程技术问答社区
std::线程导致程序中止
我有以下代码段: #include int main(){ std::thread trial([](){ return 2;}); //trial.join() return 0; } 从此我得到以下输出: terminate called without an active exception [1] 17963 abort (core dumped) ./a.out 现在,当我在创建线程后调用.join()时,这不会发生.据我所知,.join()等到线程的执行结束.但是,这似乎也可以防止流产发生.有人可以解释发生了什么吗? 解决方案 有人可以解释发生了什么吗? 从std::thread的破坏者的文档中: 如果 *这具有关联的线程(jarable()== true),std::terminate()被称为. 在示例中,您未能加入线程,因此在被破坏时是可加入的,因此该过程std::ter
8 2023-04-05
编程技术问答社区
ThreadAbortException能否跳过finally?
我所读过的所有声称在线程上的中止都将执行最后一个块,然后再从threadabortexception结束.我想确认这一点,以便我可以计划如何处理可以无限期悬挂的第三方代码.但是,以下测试让我感到困惑: public void runTest(DateTime deadline) { testThread = new Thread(() => { try { Console.WriteLine("test thread started at " + DateTime.Now.ToShortTimeString()); while (true) { } } finally { Console.WriteLine("test thread entered FINALLY at " + DateTime.Now.ToSh
0 2023-04-05
编程技术问答社区
中止对非托管DLL的调用
我有一个不受管理的dll,其函数如果输入参数为较大的值,则可以长时间运行,有时是可取的,但并非总是如此. 我如何在C#中调用此功能,以便在需要时可以中止它? 到目前为止,我试图将呼叫放在单独的线程中,但是中断和流产似乎都停止了该过程,该过程以100%CPU运行,直到完成DLL为止. 是否可以终止运行的DLL代码? 解决方案 不受管理的代码仅在"可警报的等待状态"时可以流产.当它燃烧100%CPU周期时,它不会.假设您可以获得线程句柄,则P/调用终端将起作用,而.NET非常困难.无论如何它都不会有帮助,您将泄漏线程堆栈.在一个兆字节上,您会很快用完虚拟内存.即使这只是偶尔的需求,您仍然有责任遇到主要问题,因为该线程已经突变了全球程序状态,并且您不知道如何恢复它. 中止非托管代码的唯一好方法是在单独的过程中运行它,并用process.kill()将其拍摄.操作系统将清理弹片.您需要为DLL编写一个小托管程序,并使用该过程Interop设施之一与之交谈.插座,名
4 2023-04-05
编程技术问答社区
C#的using语句是否是abort-safe的?
我刚刚阅读了"简而言之的C#4.0"(O'Reilly),我认为这是一本愿意切换到C#的程序员的好书,但这让我想知道.我的问题是using语句的定义.根据这本书(第138页), using (StreamReader reader = File.OpenText("file.txt")) { ... } 精确等效于: StreamReader reader = File.OpenText("file.txt"); try { ... } finally { if (reader != null) ((IDisposable)reader).Dispose(); } 但是,假设这是正确的,并且该代码是在单独的线程中执行的.现在,该线程被thread.Abort()中止,因此抛出了ThreadAbortException,并假设该线程正好在初始化读取器和输入try..finally子句之前.这意味着读者没有被处置! 可能的解决
0 2023-04-05
编程技术问答社区
停止一个正在运行的线程的安全方法是什么?
我有一个线程,其中包含Ironpython脚本的执行.由于某种原因,我可能需要随时停止此线程,包括脚本执行.如何实现这一目标?第一个想法是Thread.Abort(),但众所周知是邪恶的... 解决方案 从您的问题和后续评论中,我可以建议您有两个选择,并带有一些其他"警告": 如果您的线程循环在每次迭代中执行某些内容,则可以设置一个挥发性的布尔标志,以便在完成当前迭代后退出(伪码,因为我不熟悉Python): while shouldExit = false // do stuff 然后,只需将标志设置为true当您希望线程停止时,它将在下次检查条件时停止. 如果您不能等待迭代完成并需要立即停止它,则可以选择Thread.Abort,但绝对可以确保您无法离开打开的文件手柄,插座,锁或在不一致的状态下这样的其他任何事情. 其他解决方案 什么是阻止运行线程的安全方法? 将线程放在自己的过程中.当您要停止时,杀死该过程. 这是杀死线
6 2023-04-05
编程技术问答社区