小编rdl*_*rey的帖子

如何在PHP中获取POST的正文?

我作为POST提交到php页面如下:

{a:1}
Run Code Online (Sandbox Code Playgroud)

这是请求的主体(POST请求).
在php中,我需要做些什么才能提取该值?

var_dump($_POST); 
Run Code Online (Sandbox Code Playgroud)

不是解决方案,不起作用.

php rest post

243
推荐指数
5
解决办法
23万
查看次数

为什么我将mime类型的.csv文件作为"application/octet-stream"?

我正在开发一个必须将excel文件导入MySQL的PHP​​应用程序.所以我需要将excel文件转换为.csv格式.但是当我想要使用它的类型时$_FILE['something']['type'],我会得到application/octet-stream它的mime类型;
我觉得这里有问题.因为我将下面的列表收集为.csv文件mime-type:

text/comma-separated-values,  
text/csv,  
application/csv, 
application/excel, 
application/vnd.ms-excel, 
application/vnd.msexcel
Run Code Online (Sandbox Code Playgroud)

怎么了 ?

php csv file-format http-headers mime-types

41
推荐指数
2
解决办法
5万
查看次数

请求指定无效Content-Encoding标头的适当HTTP状态代码?

如果客户端发送HTTP请求并指定无法由服务器解码的Content-Encoding标头,应返回什么状态代码?

客户端将JSON数据POST到REST资源,并使用gzip编码对实体主体进行编码.但是,服务器只能解码DEFLATE编码,因为它在服务器学校的gzip类失败了.

应该返回什么HTTP响应代码?我会说415不支持的媒体类型,但它不是实体的内容类型是问题 - 它是否则支持的实体主体的编码.

哪个更合适:415?400?也许是自定义响应代码?


附录:当然,我已经彻底检查了rfc2616.如果答案在那里,我可能需要一些新的矫正眼镜,但我不相信它.


更新:

这与发送可能对客户端不可接受的响应无关.问题是客户端在服务器无法理解的编码中向服务器发送可能是或可能不是有效媒体类型的服务器(根据Content-Encoding客户端与请求消息打包在一起的头部).

这是一个边缘情况,在处理浏览器用户代理时不会遇到,但它可能会在REST API中出现,接受实体主体来创建/修改资源.

http http-status-codes http-headers

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

在PHPUnit中模拟/存根FTP操作

我是一个相对较新的单元测试转换器,我遇到了一个绊脚石:

如何使用PHP的内置ftp函数测试连接到远程FTP服务器并在远程FTP服务器上执行操作的代码?一些谷歌搜索出现了Java(MockFtpServer)的快速模拟选项,但没有什么可用于PHP.

我怀疑答案可能是为PHP的ftp函数创建一个包装类,随后可以对其进行存根/模拟来模仿成功/不成功的ftp操作,但我真的很感激那些比我聪明的人的一些意见!

请注意,我一直在使用PHPUnit,并且需要专门针对该框架提供帮助.


根据@hakre的请求,我想测试的简化代码如下所示.我基本上要求最好的测试方法:

public function connect($conn_name, $opt=array())
{
  if ($this->ping($conn_name)) {
    return TRUE;
  }

  $r = FALSE;

  try {    
    if ($this->conns[$conn_name] = ftp_connect($opt['host'])) {
      ftp_login($this->conns[$conn_name], $opt['user'], $opt['pass']);
    }
    $r = TRUE;
  } catch(FtpException $e) {
    // there was a problem with the ftp operation and the
    // custom error handler threw an exception
  }

  return $r;
}
Run Code Online (Sandbox Code Playgroud)

更新/解决方案摘要

问题摘要

我不确定如何单独测试需要与远程FTP服务器通信的方法.您如何测试能够连接到您无法控制的外部资源,对吧?

解决方案摘要

为FTP操作创建适配器类(方法:连接,ping等).然后,在测试使用适配器执行FTP操作的其他代码时,此适配器类很容易存根以返回特定值.

更新2

我最近在测试中遇到了一个使用命名空间的漂亮技巧,它允许你"模拟"PHP的内置函数.虽然适配器是我的特定情况下的正确方法,但这可能对类似情况下的其他人有所帮助:

模拟php全局函数进行单元测试

php phpunit

25
推荐指数
1
解决办法
3273
查看次数

SSL会话票证与会话ID

为了提高SSL握手性能而不保留(短)连接,有两个独立的功能已广为人知:

  • TLS会话ID
  • TLS会话门票

在很多短连接会话的情况下,哪种机制在性能开销方面是优选的并且应该使用?

我知道服务器需要缓存会话ID,会话票据在负载平衡的情况下也很容易共享,但我们假设有一个服务器在单个端口上监听(无负载平衡),并且它接收很多SHORT传入TLS连接会话.

那么在这种情况下,哪种方法(会话或门票)更可取?

ssl

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

为偶数和奇数div添加不同的类

我有一块PHP代码,如下所示:

$flag = false;
if (empty($links))
{
    echo '<h1>You have no uploaded images</h1><br />';
}

foreach ($links as $link)
{   
    $extension  = substr($link, -3);
    $image_name = ($extension == 'peg') ? substr($link, -15) : substr($link, -14);  

    ($delete_submit) ? deleteImage('.' . $image_name, $link) : '';

    echo '<div>';
        echo '<table>';

        echo '<tr><td class="fullwidth"><a class="preview_img" href="' . $link . '"><img src="' . $link . '" title="Click to enlarge" width="300" class="thumb" /></a></td></tr>';

        echo '<tr><td><span class="default">Direct:</span>&nbsp;';
        echo '<input type="text" readonly="readonly" class="link-area" onmouseover="this.select();" value="' . $link . …
Run Code Online (Sandbox Code Playgroud)

html css php

20
推荐指数
4
解决办法
3万
查看次数

PHP自动加载器类与程序自动加载器功能?

到目前为止,我已经使用了程序独立的自动加载器函数,并使用spl_autoload_register()注册它们以自动加载我的(通常)命名空间类.最近,我注意到人们提到将自动加载器类与一些着名的PHP框架结合使用.

我的代码几乎所有代码都是面向对象的,但在这个实例中,我并没有看到在基本函数中使用类"Autoloader"的优势.在可测试性方面,我觉得在我的测试中使用class_exists()检查来验证过程函数是否正确加载文件.

所以我的问题是三个:

  1. 哪些优点或功能(如果有的话)可能会影响我重构事物并开始使用完整的对象来自动加载类文件?
  2. 在明显的OOP功能之外,我是否缺少一些明显的优势?
  3. 您能否为程序或类自动加载器提供案例?

UPDATE

下面是我可能使用的典型自动加载功能的一些示例代码.它是元代码,所以不要寻找错别字.我组织我的目录结构,以便它们镜像命名空间.从explode_namespaces()理论上讲,假设函数可以作为静态方法与autoload()类中的静态方法一起包含在内,这是一个好处.将这些不同的"实用程序"函数组合为单个类中的方法可能更清晰.

function autoload($class_name)
{
  $root = APP_LIBS; // a directory path constant set at config time

  if ($namespaces = explode_namespaces($class_name)) {

    $domain = array_shift($namespaces);
    $root  .= "/$domain/";

    $class_name = array_pop($namespaces);
    $directories = array();

    foreach ($namespaces as $directory) {
      $directories[] = $directory;
    }
    $root .= implode($directories, '/');
  }

  $file = "$root/$class_name.php";
  if (file_exists($file)) {
    include $file;
  }
}
Run Code Online (Sandbox Code Playgroud)

php spl autoload

15
推荐指数
1
解决办法
2831
查看次数

相对文件路径中的点是什么意思?

我是自己编程和学习php的新手.我有两个关于文件的以下相对路径的问题

$fp = fopen ("$_SERVER[DOCUMENT_ROOT]/../orders/orders.txt", 'w');
Run Code Online (Sandbox Code Playgroud)

我对上面代码中相对路径的疑问是:

  1. 据我所知,$_SERVER[DOCUMENT_ROOT]指向不同服务器上的htdocs,www或public_html等文件结构的根目录.如果我理解正确,请指导?
  2. 这两个点在上面的路径中意味着什么?

谢谢

php

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

使用自定义关闭处理程序时防止PHP致命错误回溯输出

在理解处理PHP错误时,我必须遗漏一些东西,特别是抑制它们的输出.当发生致命错误时,我希望我的关闭处理程序函数能够正常处理它并终止脚本执行.这按预期工作.但是,我似乎无法阻止PHP输出有关致命错误的信息.

我的php.ini文件包含以下指令:

error_reporting = E_ALL | E_STRICT
display_errors = Off
Run Code Online (Sandbox Code Playgroud)

我设置error_reporting报告所有内容,我使用自定义错误处理程序来抛出异常.我的期望是display_errors = Off可以防止显示任何错误消息.

无论如何,当发生致命错误时,绕过自定义错误处理程序(因为脚本执行立即停止)并执行关闭处理程序.

现在,我的简化代码:

error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 'Off');

function shutdown_handler()
{
  $err = error_get_last();
  $fatal = array(E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR);
  if ($err && in_array($err['type'], $fatal)) {
    echo "\n\ntest fatal error output\n\n";
  }
  exit();
}

register_shutdown_function('shutdown_handler');
Run Code Online (Sandbox Code Playgroud)

为了测试它我生成一个"允许的内存大小耗尽"致命错误,如下所示:

// max out available memory
$data = '';
while(true) {
  $data .= str_repeat('#', PHP_INT_MAX);
}
Run Code Online (Sandbox Code Playgroud)

因为display_errors = Off我希望这只产生以下输出(根据关闭处理程序):

test fatal error output
Run Code Online (Sandbox Code Playgroud)

但我继续收到:

PHP Fatal …
Run Code Online (Sandbox Code Playgroud)

php error-handling

10
推荐指数
1
解决办法
4536
查看次数

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
查看次数