分类 codeigniter 下的文章

在 CI 中使用 composer 安装的依赖包

本文针对 Linux 系统,windows 第一步 根据 composer 官网进行安装 后面的步骤相同

本文参考来自:栁罗风尘 - CSDN
废话不多说

step 1  全局安装 composer

$ curl -sS https://getcomposer.org/installer | php
$ mv composer.phar /usr/local/bin/composer

step 2  创建 composer.json 到你的项目根目录

{
    "require": {
        "kriswallsmith/buzz": "*"
    }
}

这里将添加一个 Buzz package, 用来处理 HTTP Request / Response PHP 5.3.x 类.

或者直接用 composer 创建项目
composer create-project codeigniter/framework test

step 3  执行如下命令 下载依赖包

$ composer install
之后你会注意到 composer 创建了一个 ./vendors 在你的应用目录里 而且代码也在里面.

step 4 在项目中添加包的自动加载

加上下面一行在你的 index.php

require_once './vendor/autoload.php';
需要加载在
require_once BASEPATH.'core/CodeIgniter.php'; 前面

或者需要修改 application/config/config.php
$config['composer_autoload'] = 'vendor/autoload.php';

step 5 测试

例子如下:

class Test extends CI_Controller
{
    public function index()
    {
        $browser = new Buzz\Browser();
        $response = $browser->get('http://www.baidu.com');

        echo $browser->getLastRequest()."\n";
        echo $response;
    }
}

查看更多可用包可以查看 Packagist

通过IP路径直接访问ci项目

缘起

公司之前一直使用php做后台,沿用的是简学易懂的ci框架。去年下半年起,听取了相关人士的建议,招聘了java。之后java在这个公司崛起了,到现在,php已经没有立足之地,要么转java,要么离职。

boss的想法,php入门容易(这难道有错吗),没有java安全(不知道是谁给他洗的脑),java可以团队化管理(好像php不行似的,这就是不招php的借口?)...等等,他觉得反正相关人士肯定不会坑他就是了。

扯远了。公司的java项目一直用ip地址+8080+项目目录的形式访问,php当然也可以,但为了平时方便使用,一般都会选择二级域名访问。解析二级域名,设置nginx虚拟主机,习惯如此。这当下,公司的域名备案突然没了,域名状态正常,但访问会提示备案。经过一番与备案客服的询问后得知,在新的政策下,公司之前的域名备案有问题,需要整改,但一直没有回应,就被备案系统强制注销掉了。阿里云多次发送邮件到公司的邮箱,但都石沉大海。想问客服,为什么不打电话的,看到邮箱里的整改邮件,里面有一条就是网站责任人手机号不正确。好吧,得注销原来的备案主体,然后重新备案。但眼下最要紧的事是,公司承接的一些项目怎么办?尤其是小程序只能用https域名形式,现在是彻底歇菜了。一些其他的项目,想着应该可以通过ip+项目名进行访问。

践行

本以为会简单,直接通过ip+项目名访问就是了,其实不然。所有的ci项目都做了url优化,访问项目,会有一个uri重写(跳转)的步骤。原来是设置虚拟主机,项目目录就是根目录。但现在的根目录是ip地址指向的document_root,所以需要对rewrite规则做一下修改。

- 阅读剩余部分 -

ci 3.1.x新版本base_url配置

我发现的是3.1.6之后的版本里,需要对/application/config/config.php中的base_url进行设置。

查找资料说,之前的版本(2.2.5)里base_url默认置空:

/*
|--------------------------------------------------------------------------
| Base Site URL
|--------------------------------------------------------------------------
|
| URL to your CodeIgniter root. Typically this will be your base URL,
| WITH a trailing slash:
|
|    http://example.com/
|
| If this is not set then CodeIgniter will guess the protocol, domain and
| path to your installation.
|
*/
$config['base_url']    = '';

ci会自己去猜测协议,域名,及安装路径。大体应该是通过REQUEST_URI之类的请求地址解析出来的。然后base_url(),site_url()等函数使用解析出来的base_url去拼接资源的公网地址。

但新版里(3.1.8)是这样的:

/*
|--------------------------------------------------------------------------
| Base Site URL
|--------------------------------------------------------------------------
|
| URL to your CodeIgniter root. Typically this will be your base URL,
| WITH a trailing slash:
|
|    http://example.com/
|
| WARNING: You MUST set this value!
|
| If it is not set, then CodeIgniter will try guess the protocol and path
| your installation, but due to security concerns the hostname will be set
| to $_SERVER['SERVER_ADDR'] if available, or localhost otherwise.
| The auto-detection mechanism exists only for convenience during
| development and MUST NOT be used in production!
|
| If you need to allow multiple domains, remember that this file is still
| a PHP script and you can easily do that on your own.
|
*/
$config['base_url']    = '';

虽然默认值还是空字串,但上面有警告:一定要设置这个值。也就是说这个值在新版本里变成了必填值,必须要配置的项。
下面的话就是,如果没有设置,ci还是会去猜测协议,域名,及安装路径,但这只适用于开发环境(自己本地做了域名解析的除外),由于安全因素,一定不能在生产环境使用。然后提醒你,当前配置文件也是一个php脚本,所以是可以自定义一些逻辑判断的,如:设置一个域名白名单,只有在白名单内的域名才可以执行当前项目脚本。结合网上给出的案例,base_url新的配置方案如下:

$allowed_domains = array('xx.localhost', 'xx.jason.com', 'xx.seasidecrab.com');
$default_domain  = 'localhost';

if (in_array($_SERVER['HTTP_HOST'], $allowed_domains, TRUE))
{
    $domain = $_SERVER['HTTP_HOST'];
}
else
{
    $domain = $default_domain;
}

if ( is_https() )
{
    $config['base_url'] = 'https://'.$domain.'/bracelet/shop2/';
}
else
{
    $config['base_url'] = 'http://'.$domain.'/bracelet/shop2/';
}

我是习惯本地做域名解析,如xx.jason.com。这种情况下,是要设置base_url的。然后本地一个环境,家里一个环境,服务器测试一个环境,正式一个环境(正式上线后,可以把其他环境项去掉)。然后对于协议做了一个适配。

注:ci的2.x.x版本里是没有is_https()方法的。

php图片合并成图片、合并成pdf

之前做过一个通过imagick扩展实现pdf转图片的例子,对图片处理有些印象,这次碰到的是多图转PDF,使用场景:ppt转成多张图片后,按照需求重组成新的有序图组,并输出pdf。

前半截步骤暂时不考虑通过程序实现(ppt拆分成多图),这次主要实现后面的步骤:多图重组合并成pdf。

然后就搜到了这篇教程:php图片合并成图片、合并成pdf。这篇教程里展示了两个输出途径,一个是输出一张图片,另一个是输出pdf。输出图片的方法都比较熟悉,是基于php自带的gd库的一些方法实现的。后面的方法是这次的目标。它使用了一个叫html2pdf的项目,其自身又有其他的一些依赖库,如tcpdf,所以需要借助composer进行安装。

项目根目录

composer require spipu/html2pdf

安装说明:How to Install Html2Pdf - github.com

demo

require __DIR__.'/vendor/autoload.php';

use Spipu\Html2Pdf\Html2Pdf;

$html2pdf = new Html2Pdf();
$html2pdf->writeHTML('<h1>HelloWorld</h1>This is my first test');
$html2pdf->output();

具体实现

输出文件权限不够,所以直接输出到浏览器,然后另存为就好

ob_start();
$arr = array(
    "http://i3.article.fd.zol-img.com.cn/g5/M00/09/0C/ChMkJlfyfn2IERdDAAHQxdb3mPsAAWkHAMIknsAAdDd449.jpg",
    "http://i1.article.fd.zol-img.com.cn/g5/M00/09/0C/ChMkJlfyfn6IDN3UAAGMCyjcYzAAAWkHAMKq1MAAYwj981.jpg",
    "http://i0.article.fd.zol-img.com.cn/g5/M00/09/0C/ChMkJ1fyfn6IG8EYAAFskogJlD8AAWkHAMMN3YAAWyq856.jpg",
    "http://i1.article.fd.zol-img.com.cn/g5/M00/09/0C/ChMkJ1fyfn-Ia45QAAJXIvoesz0AAWkHAMOEogAAlc6771.jpg",
    "http://i3.article.fd.zol-img.com.cn/g5/M00/09/0C/ChMkJ1fyfn-INmzaAAFgdWkXDdcAAWkHAMQacIAAWCN493.jpg",
    "http://i3.article.fd.zol-img.com.cn/g5/M00/09/0C/ChMkJlfyfoCISLJGAAHzBo-1gFEAAWkHAMRyk8AAfMe709.jpg",
    "http://i1.article.fd.zol-img.com.cn/g5/M00/09/0C/ChMkJlfyfoGIapnCAAFvZFFz-uwAAWkHAMTvW0AAW98471.jpg",
    "http://i3.article.fd.zol-img.com.cn/g5/M00/09/0C/ChMkJlfyfoGIL68jAAIcxWunA8kAAWkHAMWm_AAAhzd973.jpg",
    "http://i0.article.fd.zol-img.com.cn/g5/M00/09/0C/ChMkJ1fyfoGIV8MLAAFZzELLOKgAAWkHAMVQgwAAVnk100.jpg",
    "http://i2.article.fd.zol-img.com.cn/g5/M00/09/0C/ChMkJlfyfoKIEzMNAAF6waw8hHcAAWkHAMZVSQAAXrZ458.jpg",
    "http://i4.article.fd.zol-img.com.cn/g5/M00/09/0C/ChMkJlfyfoOIQG1XAAI5eKk8DHcAAWkHAMiWVoAAjmQ624.jpg",
    "http://i1.article.fd.zol-img.com.cn/g5/M00/09/0C/ChMkJ1fyfoOIdkkaAAIpl9rgCREAAWkHAMsnogAAimv191.jpg",
    "http://i3.article.fd.zol-img.com.cn/g5/M00/09/0C/ChMkJ1fyfoOIRGmRAAG00aVhnlEAAWkHAMgpHEAAbTp099.jpg",
    "http://i3.article.fd.zol-img.com.cn/g5/M00/09/0C/ChMkJlfyfoWIQO6sAAG3EJBtOCwAAWkHAM2RNsAAbco983.jpg",
    "http://i2.article.fd.zol-img.com.cn/g5/M00/09/0C/ChMkJ1fyfoWIPGVRAAJygNzB8OkAAWkHAM4G1kAAnKY482.jpg",
    "http://i2.article.fd.zol-img.com.cn/g5/M00/09/0C/ChMkJ1fyfoaIBIFOAAKVc2qOlY8AAWkHAM6jfEAApWL812.jpg",
    "http://i0.article.fd.zol-img.com.cn/g5/M00/09/0C/ChMkJlfyfoeIL4ZPAAKKqAt2c1IAAWkHAM9I3wAAorA456.jpg",
    "http://i1.article.fd.zol-img.com.cn/g5/M00/09/0C/ChMkJ1fyfoiICob2AAKn89yMyrIAAWkHAM__vcAAqgL287.jpg",
    "http://i1.article.fd.zol-img.com.cn/g5/M00/09/0C/ChMkJlfyfoiIHVHnAAKGDOSadw0AAWkHANCy_oAAoYk417.jpg",
    "http://i3.article.fd.zol-img.com.cn/g5/M00/09/0C/ChMkJ1fyfomIfYZPAAHdVx-ZrvsAAWkHANFUh4AAd1v749.jpg"
);
foreach($arr as $k=>$v){
    echo '<page orientation="paysage"><img src="'.$v.'" style="float:left;vertical-align:middle;"></page>';
}
$content = ob_get_clean();
require __DIR__.'/vendor/autoload.php';
use Spipu\Html2Pdf\Html2Pdf;
use Spipu\Html2Pdf\Exception\Html2PdfException;

try
{
    $html2pdf = new Html2Pdf('P', 'A4', 'fr');
    $html2pdf->pdf->SetDisplayMode('fullpage');
    $html2pdf->writeHTML($content);
//    $html2pdf->output('dingling20161013.pdf','F');
    $html2pdf->output('dingling20161013.pdf');
} catch(Html2PdfException $e) {
    echo $e;
    exit;
}

改写成ci library

把vendor直接改成imgs2pdf放到library目录下,再添加一个这样内容的Imgs2pdf_init.php引入文件

class Imgs2pdf_init
{
    private $ci;

    public function __construct()
    {
        $this->ci =& get_instance();
        
        require_once 'imgs2pdf/autoload.php';
    }
}

ci 调用

$this->load->library('imgs2pdf_init');

use Spipu\Html2Pdf\Html2Pdf;
$html2pdf = new Html2Pdf();

or

$html2pdf = new Spipu\Html2Pdf\Html2Pdf();