1.部分方法存在可选参数后面跟必要参数的问题,不兼容PHP8。这个发现的比较早,只记得分布比较散,不清楚最新版有没有解决(主要是因为我懒得去翻了)。后面的问题比较好找,所以会持续关注最新版的,只要文中没说明那就依然存在。写这篇文章时最新版是4.1.4。 2.system/HTTP/IncomingRequest.php : getFiles方法 根据文档风格推断此处应当返回\CodeIgniter\HTTP\Files\FileCollection对象,而非array。
3.system/Controller.php中initController应为__construct,同时system/CodeIgniter.php中createController方法内调用initController改为将参数传递给构造函数。搞不懂为什么放着构造函数不用偏要另搞一个initController。 Controller.php: CodeIgniter.php: 4. \Config\Database::utils似乎是太监了,我自作主张已从CI3中复制了mysqli的backup方法。当然了,这个方法相当吃内存,所以只适用于少量数据的备份,量大的还是mysqldump更香。system/Database/MySQLi/Utils.php:
public function _backup(array $params = null)
{
if (count($params) === 0)
{
return FALSE;
}
extract($params);
$output = '';
if ($foreign_key_checks === FALSE)
{
$output .= 'SET foreign_key_checks = 0;'.$newline;
}
foreach ( (array) $tables as $table)
{
if (in_array($table, (array) $ignore, TRUE))
{
continue;
}
$query = $this->db->query('SHOW CREATE TABLE '.$this->db->escapeIdentifiers($this->db->database.'.'.$table));
if ($query === FALSE)
{
continue;
}
$output .= '#'.$newline.'# TABLE STRUCTURE FOR: '.$table.$newline.'#'.$newline.$newline;
if ($add_drop === TRUE)
{
$output .= 'DROP TABLE IF EXISTS '.$this->db->protectIdentifiers($table).';'.$newline.$newline;
}
$i = 0;
$result = $query->getResultArray();
foreach ($result[0] as $val)
{
if ($i++ % 2)
{
$output .= $val.';'.$newline.$newline;
}
}
if ($add_insert === FALSE)
{
continue;
}
$query = $this->db->query('SELECT * FROM '.$this->db->protectIdentifiers($table));
if ($query->numRows === 0)
{
continue;
}
$i = 0;
$field_str = '';
$is_int = array();
while ($field = $query->resultID->fetch_field())
{
$is_int[$i] = in_array(strtolower($field->type),
array('tinyint', 'smallint', 'mediumint', 'int', 'bigint'),
TRUE);
$field_str .= $this->db->escapeIdentifiers($field->name).', ';
$i++;
}
$field_str = preg_replace('/, $/' , '', $field_str);
foreach ($query->getResultArray() as $row)
{
$val_str = '';
$i = 0;
foreach ($row as $v)
{
if ($v === NULL)
{
$val_str .= 'NULL';
}
else
{
$val_str .= ($is_int[$i] === FALSE) ? $this->db->escape($v) : $v;
}
$val_str .= ', ';
$i++;
}
$val_str = preg_replace('/, $/' , '', $val_str);
$output .= 'INSERT INTO '.$this->db->protectIdentifiers($table).' ('.$field_str.') VALUES ('.$val_str.');'.$newline;
}
$output .= $newline.$newline;
}
if ($foreign_key_checks === FALSE)
{
$output .= 'SET foreign_key_checks = 1;'.$newline;
}
return $output;
}
5.CURLRequest中请求发送后返回的Response是同一个实例!作为小白也不知道这么干到底能节省多少开销,姑且跟着大神们的步子走吧。可好歹每次请求后把该重置的东西给清干净啊!body是每次都重置了,可是开发组似乎遗忘了headers???在某些需要从headers中读取数据的API中,这种不干净的处理会导致后面的请求读了前面的数据,比如阿里云的OSS相关API。我的办法是先修改Message类,在system/HTTP/Message.php中新增一个clearHeaders方法,然后修改system/HTTP/CURLRequest.php中的setResponseHeaders方法,在开头先清一下,然后再存入新的headers。 6.还是CURLRequest类,发起请求时,CI把客户端的headers直接转过去了,但是开发组似乎认为所有客户端请求都不会携带Content-Length,然而我今天却真真实实地遇上了:nginx代理fpm的时候,如果客户端请求类型是multipart/form-data,headers会带有Content-Length,把这玩意也转过去,API一不留神就把数据处理错了(比如支付宝的转账接口),然后请求就无法识别,然后就报错了。。。解决办法倒是很简单,在applyRequestHeaders方法中删除Host、Accept-Encoding那里加一行移除Content-Length就行。 暂时就发现这么些,后续如果有新发现还会在这里更新。写这个主要是自己记个笔记,同时也是分享踩坑经验,欢迎收藏,但请勿转载,谢谢!
|