小编rdl*_*rey的帖子

PHP:生产中的FATAL错误的日志堆栈跟踪

我想记录每个致命错误,甚至超时和其他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)

php error-handling

8
推荐指数
1
解决办法
7510
查看次数

PHP 5.4对象解除引用是否成功地减轻了此DI容器中静态存储参数的缺点?

公共服务更新:

自从我最初提出这个问题以来,我学到了很多东西.如果您正在阅读本文,请接受我的建议并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 dependency-injection

8
推荐指数
1
解决办法
1041
查看次数

如何加密非阻塞PHP套接字流?

我试图以非阻塞(异步)方式使用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标志并没有有意义地改变"总耗时"脚本输出.

有关为什么会发生这种情况的任何想法,以及如何强制执行非阻塞连接尝试?

php sockets ssl

8
推荐指数
1
解决办法
2062
查看次数

如何在没有Content-Length标头的情况下流式传输HTTP文件?

是否可以将文件上传到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://输入读取

php apache http http-streaming

8
推荐指数
1
解决办法
9516
查看次数

使用自定义流包装器作为PHP的http://流包装器的测试存根

我正在编写一个自定义流包装器,用作使用内置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 stream stream-wrapper

7
推荐指数
1
解决办法
1282
查看次数

什么样的问题会在PHP中生成E_COMPILE_WARNING?

我花了一些时间搜索Google以及SO,并且无法找到这个简单问题的答案:

E_COMPILE_WARNING在PHP中会产生什么样的问题?

关于主题 文档PHP手册条目E_COMPILE_WARNING:

编译时警告(非致命错误).这类似于E_WARNING,除了它是由Zend Scripting Engine生成的.

但我不确定这会构成什么.E_WARNINGZend脚本引擎提出的常规警告和警告之间有什么区别?有人可以解释并提供代码片段(如果适用)吗?

php

6
推荐指数
1
解决办法
462
查看次数

PHP:关闭输出流

是否可以关闭PHP脚本的输出流?我有一个脚本需要做一些后期处理,但在后处理期间和之后它不再向客户端发送任何数据,所以我想在后期处理之前关闭连接.

编辑:在我的应用程序中,我有一个缓存,需要不时地重建.但是,我不想让用户放慢速度.我想要的是在脚本的最后确定是否需要重建缓存.所以我想首先关闭输出流,以便用户获取它的数据,然后我想重建缓存.这样做并不是很关键,但我认为最好先关闭连接,这样用户就不会注意到缓存正在重建,如果这需要很长时间.

php outputstream http-headers

6
推荐指数
1
解决办法
2994
查看次数

使用php preg_replace更改html链接的href属性

我正在尝试用不同的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)

php preg-replace

6
推荐指数
2
解决办法
3万
查看次数

PHP使用SPL迭代器递归删除空目录

我正在努力解决如何使用SPL迭代器删除PHP中的空目录树.考虑以下目录结构,其中所有目录都是空的:

/ TOPDIR

  level1

       level2
Run Code Online (Sandbox Code Playgroud)

我尝试过以下方法:

$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等等.请不要提供这些/类似功能的解决方案.

我觉得我必须在这里错过一些非常基本的东西......

php iterator

6
推荐指数
1
解决办法
1890
查看次数

餐厅表可用性使用sql检查特定时间

我正在尝试使用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 mysql sql yii

6
推荐指数
1
解决办法
1376
查看次数