我想记录每个致命错误,甚至超时和其他E_ERRORS错误.我使用set_error_handler和shutdown函数,但是最后一个我没有stacktrace.有没有办法拥有它?
我想在生产服务器上记录致命错误,以帮助解决仅在生产中发生的错误.我知道,开发服务器上的xdebug必须足够,但事实并非如此.也许我们可以使用xdebug激活最少的选项,或者使用它的剥离版本将堆栈跟踪添加到错误日志中?
如果发生一个错误,即使超时,此代码也会打印错误信息.
<?php
function shutdown()
{
$a=error_get_last();
if($a!==null) print_r($a);
}
register_shutdown_function('shutdown');
Run Code Online (Sandbox Code Playgroud) 公共服务更新:
自从我最初提出这个问题以来,我学到了很多东西.如果您正在阅读本文,请接受我的建议并static完全避免.只是.别.使用.它.没有办法依赖注入; 依赖注入是方法.
我最近花了很多时间深入研究各种控制反转(IOC)概念.我完全同意那些认为服务定位器是反模式的人.我构建了一个以修补它并且对使用静态定位器方法在类中间导入"全局"实体所允许的功能以及隐藏对象的实际依赖性的可能性感到震惊.
继续从服务定位器开始,我创建了一个依赖注入(DI)容器,它给了我静态依赖访问的灵活性,而没有静态变量的伴随缺点.
以下是此类实现的简单示例:
<?php
class Container
{
protected static $params = [];
public function store($key, $val)
{
static::$params[$key] = $val;
return $this;
}
public function fetch($key)
{
if (isset(static::$params[$key])) {
return static::$params[$key];
}
$msg = "No parameter match found in container: $key";
throw new OutOfBoundsException($msg);
}
}
$container = new Container;
$container->store('widgetDep', new WidgetDependency);
$container->store('kumquatDep', new KumquatDependency);
// and somewhere else in the application without access to the …Run Code Online (Sandbox Code Playgroud) 我试图以非阻塞(异步)方式使用PHP的stream_socket_client()函数.PHP网站上的文档表明STREAM_CLIENT_ASYNC_CONNECT选项标志应启用此功能.但是,以下代码......
$start_time = microtime(true);
$sockets[$i] = stream_socket_client('ssl://74.125.47.109:993', $errint, $errstr, 1, STREAM_CLIENT_ASYNC_CONNECT);
$end_time = microtime(true);
echo "Total time taken: " . ($end_time-$start_time) . " secs.";
Run Code Online (Sandbox Code Playgroud)
输出以下内容:
Total time taken: 0.76204109191895 secs.
Run Code Online (Sandbox Code Playgroud)
显然,该函数是阻塞的(还有一个事实是,遗漏STREAM_CLIENT_ASYC_CONNECT标志并没有有意义地改变"总耗时"脚本输出.
有关为什么会发生这种情况的任何想法,以及如何强制执行非阻塞连接尝试?
是否可以将文件上传到apache php服务器而不包含内容长度标题?
我正在尝试将我正在创建的文件作为文件上传流式传输.当我不使用内容长度标题时,我得到了apache"501 Method Not Implemented".
$sock = fsockopen($host,80,$errno, $error);
fwrite($sock, "POST $resource HTTP/1.1\r\n" .
"Host: $host\r\n\r\n");
fwrite($sock,fread($readHandle,filesize($file)));
Run Code Online (Sandbox Code Playgroud)
如果我包含内容长度,它工作正常.
服务器正在从php://输入读取
我正在编写一个自定义流包装器,用作使用内置http://流包装器的HTTP客户端类的单元测试中的存根.
具体来说,我需要'wrapper_data'通过调用stream_get_meta_data自定义流包装器创建的流来控制密钥中返回的值.不幸的是,有关自定义流包装器的文档很糟糕,API似乎不直观.
自定义包装器中的哪种方法控制元wrapper_data响应?
使用底部的类,当我var_dump(stream_get_meta_data($stream));使用自定义包装器创建的流时,我只能得到以下结果...
array(10) {
'wrapper_data' =>
class CustomHttpStreamWrapper#5 (3) {
public $context =>
resource(13) of type (stream-context)
public $position =>
int(0)
public $bodyData =>
string(14) "test body data"
}
...
Run Code Online (Sandbox Code Playgroud)
但我需要哄骗包装器在元数据检索上产生类似下面的东西,这样我就可以测试客户端类对真实http://流包装器返回的数据的解析...
array(10) {
'wrapper_data' => Array(
[0] => HTTP/1.1 200 OK
[1] => Content-Length: 438
)
...
Run Code Online (Sandbox Code Playgroud)
这是我目前为自定义包装器提供的代码:
class CustomHttpStreamWrapper {
public $context;
public $position = 0;
public $bodyData = 'test body data';
public function stream_open($path, …Run Code Online (Sandbox Code Playgroud) 是否可以关闭PHP脚本的输出流?我有一个脚本需要做一些后期处理,但在后处理期间和之后它不再向客户端发送任何数据,所以我想在后期处理之前关闭连接.
编辑:在我的应用程序中,我有一个缓存,需要不时地重建.但是,我不想让用户放慢速度.我想要的是在脚本的最后确定是否需要重建缓存.所以我想首先关闭输出流,以便用户获取它的数据,然后我想重建缓存.这样做并不是很关键,但我认为最好先关闭连接,这样用户就不会注意到缓存正在重建,如果这需要很长时间.
我正在尝试用不同的URL替换大字符串中的所有链接href.使用以下代码它似乎只替换第二个链接,保留第一个完整,有人可以帮助我吗?
$string_of_text = '<a href="http://www.php.net/">PHP</a> <a href="http://www.apache.org/">Apache</a>';
echo preg_replace('/<a(.*)href="(.*)"(.*)>/','<a$1href="javascript:alert(\'Test\');"$3>',$string_of_text);
Run Code Online (Sandbox Code Playgroud) 我正在努力解决如何使用SPL迭代器删除PHP中的空目录树.考虑以下目录结构,其中所有目录都是空的:
/ TOPDIR
Run Code Online (Sandbox Code Playgroud)level1 level2
我尝试过以下方法:
$it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator(
'/topdir', RecursiveIteratorIterator::CHILD_FIRST
));
foreach ($it as $file) {
if ($file->isDir()) {
rmdir((string)$file);
}
}
Run Code Online (Sandbox Code Playgroud)
但是RecursiveIteratorIterator::CHILD_FIRST防止底层文件成为循环的一部分,我得到标准的Directory not emptyE_WARNING,因为level1不为空.
如何使用SPL迭代器递归删除空目录树?注意:我知道如何使用glob,scandir等等.请不要提供这些/类似功能的解决方案.
我觉得我必须在这里错过一些非常基本的东西......
我正在尝试使用yii框架构建餐厅表管理应用程序,目前我仍然坚持在特定时间检索表的可用性
我有以下表格
下面的图像显示了我的表结构

我通过使用以下代码获得可用表
$model = new Table;
$criteria = new CDbCriteria;
$criteria->condition = 'floor_id=' . $floorid;
$rows = $model->model()->with(array(
'bookingTables' => array(
'condition' => 'bookingTables.table_id IS NULL'
)))->findAll($criteria);
Run Code Online (Sandbox Code Playgroud)
这仅适用于booking_table表中不存在表ID的情况
假设如果说booking_table表已经填充了表ID,那么上面的代码将无法正常运行它将始终返回为不可用(不知道如何使用时间来获取可用的表)
那么如何在yii或sql中的任何解决方案中获取特定时间段的可用表
php ×10
apache ×1
http ×1
http-headers ×1
iterator ×1
mysql ×1
outputstream ×1
preg-replace ×1
sockets ×1
sql ×1
ssl ×1
stream ×1
yii ×1