PHPMailer配置ssl连接smtp服务器失败解决办法

 更新时间:2016年11月25日 16:17  点击:1568
PHPMailer是一款邮件发送插件了,我们只要简单的配置就可以实现发邮件了,但小编在配置使用ssl时发现无法连接服务器了,下面我们来看问题解决办法.

使用PHPMailer发送邮件都是使用未加密的smtp服务器,这次使用的smtp服务器要用ssl(Secure Sockets Layer,安全套接层)方式连接。

好在PHPMailer支持ssl的smtp服务器,网上查了资料,以为改下端口,加上SMTPSecure设置就可以了,但是事实并非如此。

代码中端口改成了465,加了$mail->SMTPSecure = "ssl";设置,结果PHPMailer一直提示不能连接主机。

网上各种查资料,各种咨询,百般折腾后终于找到了原因,PHP没有开启openssl扩展,汗……

windows开启openssl扩展

在php.ini文件中找到;extension=php_openssl.dll,把前边的“分号”去掉,重启一下Apache即可。

linux开启openssl扩展

cd php-5.2.14/ext/openssl/
mv config0.m4 config.m4
phpize
./configure
make
make install
 
修改php.ini文件, 在适当的位置添加

extension=openssl.so

给php-fpm master进程发一个USR2信号,ssl扩展添加成功。

php扩展开发对于很多朋友来讲都不太可能实现现因为php扩展开发是需要懂c的,下面我来为各位介绍一个 php扩展开发例子吧.

h1. 一、自动化建立扩展框架

到源码ext目录下

帮助
1
./ext_skel --extname=xiami_ext
生成如下几个文件文件列表:
* CREDITS
* EXPERIMENTAL
* config.m4
* config.w32
* php_xiami_ext.h
* tests
* xiami_ext.c
* xiami_ext.php

.c文件就是C语言系列的源文件,而.h文件则是C语言的头文件,即C系列中存放函数和全局变量的文件。子程序不要定义在*.h中。函数定义要放在*.c中,而*.h只做声明.否则多引用几次,就会发生函数重复定义的错误。

h1. 二、编写函数xiami_hello

h3. 1、不带参数

php_xiami_ext.h

 
PHP_MINIT_FUNCTION(xiami_ext);
PHP_MSHUTDOWN_FUNCTION(xiami_ext);
PHP_RINIT_FUNCTION(xiami_ext);
PHP_RSHUTDOWN_FUNCTION(xiami_ext);
PHP_MINFO_FUNCTION(xiami_ext);
 
PHP_FUNCTION(xiami_hello);
xiami_ext.c

 
const zend_function_entry xiami_ext_functions[] = {
    ZEND_FE(confirm_xiami_ext_compiled, NULL)
    ZEND_FE(xiami_hello,        NULL)
    PHP_FE_END
};
 
ZEND_FUNCTION(xiami_hello)
{
    php_printf("Hello World!n");
}
h3. 2、接收外来参数

xiami_ext.c
 
ZEND_BEGIN_ARG_INFO(arg_xiami_hello, 0)
ZEND_ARG_INFO(0, name)
ZEND_END_ARG_INFO()
 
ZEND_FUNCTION(xiami_hello)
{
    char *name = NULL;
    int argc = ZEND_NUM_ARGS();
    int name_len;
 
    if (zend_parse_parameters(argc TSRMLS_CC, "s", &name, &name_len) == FAILURE)
        return;
    php_printf("hello %s",name);
}
 
const zend_function_entry xiami_ext_functions[] = {
    ZEND_FE(confirm_xiami_ext_compiled, NULL)
    ZEND_FE(xiami_hello,        arg_xiami_hello)
    PHP_FE_END
};
以ZEND_BEGIN_ARG_INFO宏定义开始,以ZEND_END_ARG_INFO()结束,这两个宏定义解释如下:

ZEND_BEGIN_ARG_INFO(name, pass_rest_by_reference):
开始参数块定义,pass_rest_by_reference为1时,强制所有参数为引用类型
ZEND_END_ARG_INFO()

ZEND_NUM_ARGS()代表着参数的个数:

 
参数   代表着的类型
b   Boolean
l   Integer 整型
d   Floating point 浮点型
s   String 字符串
r   Resource 资源
a   Array 数组
o   Object instance 对象
O   Object instance of a specified type 特定类型的对象
z   Non-specific zval 任意类型~
Z   zval**类型
h1. 三、编写类XiamiClass

h3. 1、步骤

# 创建一个全局的zend_class_entry变量,用于存储类的入口。
# 创建一个zend_function_entry结构体数组,用于存储类中包含的方法。
# 在扩展的MINIT方法中注册类。

h3. 2、空类

xiami_ext.c
首先,我们创建一个名为php_xiamiclass_entry的zend_class_entry结构体变量,该结构体变量实际存储了我们创建的类的入口。

 
zend_class_entry *php_xiamiclass_entry;
这里的php_xiamiclass_entry在扩展源文件中是一个全局变量,为了使其它扩展可以使用我们创建的类,
这个全局变量应该在头文件中定义。

接下来,我们创建zend_function_entry结构体数组,这个数组与函数定义时的数组是一样的。
 
const zend_function_entry xiami_ext_methods[] = {
    PHP_FE_END
};
在MINIT函数中,首先创建了一个xiami_ce变量用于存储临时的类入口,接下来使用INIT_CLASS_ENTRY
宏初始化该变量,之后使用zend_register_internal_class()将该类注册到Zend引擎,
该函数会返回一个最终的类入口,将其赋值给前面创建的全局变量。

 
PHP_MINIT_FUNCTION(xiami_ext)
{
    zend_class_entry xiami_ce;
    INIT_CLASS_ENTRY(xiami_ce, "XiamiClass", xiami_ext_methods);
 
    php_xiamiclass_entry = zend_register_internal_class(&xiami_ce TSRMLS_CC);
    return SUCCESS;
}
h3. 3、类方法

php_xiami_ext.h
 
PHP_MINIT_FUNCTION(xiami_ext);
PHP_MSHUTDOWN_FUNCTION(xiami_ext);
PHP_RINIT_FUNCTION(xiami_ext);
PHP_RSHUTDOWN_FUNCTION(xiami_ext);
PHP_MINFO_FUNCTION(xiami_ext);
 
PHP_METHOD(XiamiClass,__construct);
PHP_METHOD(XiamiClass, set_xiami_age);
xiami_ext.c
 
ZEND_BEGIN_ARG_INFO_EX(arg_construct, 0, 0, 1)
    ZEND_ARG_INFO(0, age)
ZEND_END_ARG_INFO();
 
ZEND_BEGIN_ARG_INFO(arg_xiami_age, 0)
    ZEND_ARG_INFO(0, age)
ZEND_END_ARG_INFO()
 
PHP_METHOD(XiamiClass, __construct)
{
    long age;
    if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &age) == FAILURE){
        WRONG_PARAM_COUNT;
    }
    if( age <= 0 ) {
        age = 1;
    }
 
    zend_update_property_long(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("_age"), age TSRMLS_CC);
    RETURN_TRUE;
}
 
PHP_METHOD(XiamiClass, set_xiami_age)
{
    long age;
    if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &age) == FAILURE){
        WRONG_PARAM_COUNT;
    }
    if( age <= 0 ) {
        age = 1;
    }
    zend_update_property_long(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("_age"), age TSRMLS_CC);
    RETURN_TRUE;
}
 
PHP_MINIT_FUNCTION(xiami_ext)
{
    zend_class_entry xiami_ce;
    INIT_CLASS_ENTRY(xiami_ce, "XiamiClass", xiami_ext_methods);
 
    php_xiamiclass_entry = zend_register_internal_class(&xiami_ce TSRMLS_CC);
 
    zend_declare_property_null(php_xiamiclass_entry, ZEND_STRL("_age"), ZEND_ACC_PRIVATE TSRMLS_CC);
    return SUCCESS;
}
zend_declare_property_*系列函数:

 
ZEND_API int zend_declare_property_null(zend_class_entry *ce, char *name, int name_length, int access_type TSRMLS_DC);
用zend_read_property()和zend_update_property()函数:

 
ZEND_API zval *zend_read_property(zend_class_entry *scope, zval *object, char *name, int name_length, zend_bool silent TSRMLS_DC);
 
ZEND_API void zend_update_property(zend_class_entry *scope, zval *object, char *name, int name_length, zval *value TSRMLS_DC);
h1. 四、读取ini文件

php_xiami_ext.h

 
PHP_MINIT_FUNCTION(xiami_ext);
PHP_MSHUTDOWN_FUNCTION(xiami_ext);
PHP_RINIT_FUNCTION(xiami_ext);
PHP_RSHUTDOWN_FUNCTION(xiami_ext);
PHP_MINFO_FUNCTION(xiami_ext);
 
PHP_FUNCTION(xiami_hello);
ZEND_BEGIN_MODULE_GLOBALS(xiami_ext)
    long  age;
ZEND_END_MODULE_GLOBALS(xiami_ext)
 
#ifdef ZTS
#define XIAMI_EXT_G(v) TSRMG(xiami_ext_globals_id, zend_xiami_ext_globals *, v)
#else
#define XIAMI_EXT_G(v) (xiami_ext_globals.v)
#endif
xiami_ext.c

 
ZEND_DECLARE_MODULE_GLOBALS(xiami_ext)
 
PHP_INI_BEGIN()
   STD_PHP_INI_ENTRY("xiami_ext.age",      "42", PHP_INI_ALL, OnUpdateLong, age, zend_xiami_ext_globals, xiami_ext_globals)
PHP_INI_END()
 
static void php_xiami_ext_init_globals(zend_xiami_ext_globals *xiami_ext_globals)
{
    xiami_ext_globals->age = 10;
}
 
PHP_MINIT_FUNCTION(xiami_ext)
{
    ZEND_INIT_MODULE_GLOBALS(xiami_ext, php_xiami_ext_init_globals, NULL);
    REGISTER_INI_ENTRIES();
 
    return SUCCESS;
}
 
ZEND_FUNCTION(xiami_hello)
{
    RETURN_LONG(XIAMI_EXT_G(age));
}
 
const zend_function_entry xiami_ext_functions[] = {
    ZEND_FE(xiami_hello,        NULL)
    PHP_FE_END
};
STD_PHP_INI_ENTRY的最后三个参数是来告诉PHP修改哪个全局变量,我们扩展的全局变量的数据结构,以及这些全局变量被保存到的全局容器的名称。
在php_xiami_ext.h添加的内容中,使用了一对宏ZEND_BEGIN_MODULE_GLOBALS()和ZEND_END_MODULE_GLOBALS() — 用来创建一个包含一个age类型,名为zend_xiami_ext_globals的结构体。然后继续声明了XIAMI_EXT_G()来从一个线程池中获取值,或者只是从全局空间中获取 - 如果你为一个非线程环境编译的话。

在php_xiami_ext.c中你用了ZEND_DECLARE_MODULE_GLOBALS()宏来真正实例化zend_xiami_ext_globals结构体为一个真正的全局变量.最后,在MINIT中,你使用了ZEND_INIT_MODULE_GLOBALS()来分配一个线程安全的资源id.

phpinfo扩展信息中,显示ini信息

 
PHP_MINFO_FUNCTION(xiami_ext)
{
    php_info_print_table_start();
    php_info_print_table_header(2, "xiami_ext support", "enabled");
    php_info_print_table_end();
 
    DISPLAY_INI_ENTRIES();
}
h1. 五、设置常量
 
PHP_MINIT_FUNCTION(ggg)
{
    zend_constant c;
    char *trim_key = "xiami";
    char *trim_val = "hello";
    int trim_val_len,trim_key_len;
 
    trim_key_len = strlen(trim_key);
    trim_val_len = strlen(trim_val);
 
    c.value.type = IS_STRING;
    c.value.value.str.val = pestrdup(trim_val, trim_val_len+1);
    c.value.value.str.len = trim_val_len;
    c.flags = CONST_PERSISTENT | CONST_CS;
    c.name = pestrdup(trim_key, trim_key_len+1);
    c.name_len = trim_key_len+1;
    c.module_number = module_number;
    zend_register_constant(&c TSRMLS_CC);
 
    return SUCCESS;
}
h1. 六、资源处理

PHP中的资源类型在内核中是通过一个zend_rsrc_list_entry结构体来实现:
 
typedef struct _zend_rsrc_list_entry {
    void *ptr;
    int type;
    int refcount;
} zend_rsrc_list_entry;
其中,ptr是一个指向资源的最终实现的指针,例如一个文件句柄,或者一个数据库连接结构。type是一个类型标记,用于区分不同的资源类型。refcount用于资源的引用计数。
资源类型可分为普通的资源,以及持久型的资源。例如mysql普通连接与持久连接。均保存在_zend_executor_globals结构体当中,其中包含如下两个HashTable
 
struct _zend_executor_globals {
    ...
    HashTable regular_list;
    HashTable persistent_list;
    ...
}
regular_list保存普通资源,persistent_list则保存持久型资源。
要使用资源,先要注册一个资源类型,使用如下的API函数:
 
ZEND_API int zend_register_list_destructors_ex(rsrc_dtor_func_t ld, rsrc_dtor_func_t pld, const char *type_name, int module_number);
此函数返回一个资源类型id,zend_rsrc_list_entry结构体当中的type成员即对应此值。在扩展当中,此id应作为一个全局变量保存,以传递给其它资源API。
函数的第一及第二个参数,分别对应普通资源及持久资源的析构函数,第三个参数为资源类型的简短名称描述,一般用于错误提示,最后一个参数module_number为引擎内部使用,当我们调用这个函数时,只需要传递一个已经定义好的module_number变量。

 
static void myfile_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC){
     FILE *fp = (FILE *) rsrc->ptr;
     fclose(fp);
}
 
PHP_MINIT_FUNCTION(myfile) {
 
//le_myfile是一个用于保存资源类型id的全局变量
     le_myfile = zend_register_list_destructors_ex(myfile_dtor,NULL,"standard-c-file", module_number);
     return SUCCESS;
要创建一个资源,通过ZEND_REGISTER_RESOURCE()函数:

 
ZEND_API int zend_register_resource(zval *rsrc_result, void *rsrc_pointer, int rsrc_type TSRMLS_DC);
#define ZEND_REGISTER_RESOURCE(rsrc_result, rsrc_pointer, rsrc_type)  zend_register_resource(rsrc_result, rsrc_pointer, rsrc_type TSRMLS_CC);
其第一个参数rsrc_result是一个指向zval的指针,很显然其作用是将PHP变量和资源进行绑定。
第二个参数rsrc_pointer是一个指向资源数据的指针。
第三个参数rsrc_type,很显然,是上面通过zend_register_list_destructors_ex()函数注册所返回的资源类型id。

 
PHP_FUNCTION(file_open){
     char *filename = NULL;
     char *mode = NULL;
     int argc = ZEND_NUM_ARGS();
     int filename_len;
     int mode_len;
     FILE *fp;
 
     if (zend_parse_parameters(argc TSRMLS_CC, "ss", &filename,&filename_len, &mode, &mode_len) == FAILURE) {
          return;
     }
 
     fp = fopen(filename, mode);
 
     if (fp == NULL) {
          RETURN_FALSE;
     }
 
     ZEND_REGISTER_RESOURCE(return_value, fp, le_myfile);
}
要访问一个资源,是通过ZEND_FETCH_RESOURCE()函数来进行的:

 
ZEND_API void *zend_fetch_resource(zval **passed_id TSRMLS_DC, int default_id, const char *resource_type_name, int *found_resource_type, int num_resource_types, ...);
#define ZEND_VERIFY_RESOURCE(rsrc)  if (!rsrc) { RETURN_FALSE; }
#define ZEND_FETCH_RESOURCE(rsrc, rsrc_type, passed_id, default_id, resource_type_name, resource_type)  rsrc = (rsrc_type) zend_fetch_resource(passed_id TSRMLS_CC, default_id, resource_type_name, NULL, 1, resource_type);    ZEND_VERIFY_RESOURCE(rsrc);
第一个参数rsrc,是要保存资源值所对应的变量名。
第二个参数,是一个指针转换的定义,用于内部将资源转换为正确的类型。
第三个参数,是一个对应的资源值
第四个参数,用于实现资源的默认值
第五个参数,同zend_register_list_destructors_ex()的第三个参数
第六个参数,对应zend_register_list_destructors_ex()的返回值

 
PHP_FUNCTION(file_write){
     char *buffer = NULL;
     int argc = ZEND_NUM_ARGS();
     int buffer_len;
     zval *filehandle = NULL;
     FILE *fp;
 
     if (zend_parse_parameters(argc TSRMLS_CC, "rs", &filehandle,&buffer, &buffer_len) == FAILURE) {
          return;
     }
 
     ZEND_FETCH_RESOURCE(fp, FILE *, &filehandle, -1, "standard-cfile", le_myfile);
 
     if (fwrite(buffer, 1, buffer_len, fp) != buffer_len) {
          RETURN_FALSE;
     }
 
     RETURN_TRUE;
}
要删除一个资源,则使用zend_list_delete()函数:

 
ZEND_API int _zend_list_delete(int id TSRMLS_DC);
#define zend_list_delete(id)  _zend_list_delete(id TSRMLS_CC)
这个函数仅有一个资源id的参数,返回SUCCESS或者FAILURE。
 
 
PHP_FUNCTION(file_close){
     int argc = ZEND_NUM_ARGS();
     zval *filehandle = NULL;
 
     if (zend_parse_parameters(argc TSRMLS_CC, "r", &filehandle) == FAILURE) {
          return;
     }
 
     if (zend_list_delete(Z_RESVAL_P(filehandle)) == FAILURE) {
          RETURN_FALSE;
     }
 
     RETURN_TRUE;
}
参考:

其实php下cookies或session实现多二级域名同时登录小编觉得还是比较简单了,下面一起来看一个例子吧.

公司网站设置了几个二级域名,老板要求无论会员走到哪个域名,主域名或者二级域名,用户都是登录状态,而不需要重新登录。
很明显,要求是单点登录。

php中有两种方法实现,情况不外乎是利用cookie保存session_id,各域名都可以访问到该cookie,进而获取该session_id:

1. 使用session_set_cookie_params()方法:

session_set_cookie_params(0, $path,'abc.com');

2. 使用ini_set或修改php.ini,修改session.cookie_domain的值:

ini_set('session.cookie_domain','abc.com')

php curl函数是可以实现文件下载功能了,下面这个例子是利用 php curl下载文件来处理服务器间文件手动同步了,有兴趣的可进入看看.

有一个需求,情况如下:

两台服务器,一台测试服务器[apache],一台生产服务器[nginx],产品编辑人员在测试服务器使用php upload批量上传产品,图片,经检查后,
可以同步其所上传的产品和图片[打包成zip文件]到生产服务器上,但生产服务器上不接受php upload上传文件的,那么就不能在测试服务器上直接post到正式

服务器了。

 

暂时想到几个方法:
1. 使用rsync手动同步过去,但需要配置,并且需要php执行shell命令,但我不想这样。
2. 可以使用socket来传送数据,但需要开启端口,我也不想这么做,因如果一时忘记在防火墙开放端口,就无法传送了
3. 测试服务器发送信号到生产服务器,让生产服务器使用php curl从测试服务器下载文件并处理

通过比较,还是觉得第3种方法比较妥当,直接全程使用php来处理,至少减少一些不必要的维护麻烦。

以下是php curl download的方法代码内容:

function curl_download($testing_server_file, $local_file) {
  $rfp = curl_init($testing_server_file);
  $fp = fopen($local_file, "wb");
 
  curl_setopt($cp, CURLOPT_FILE, $fp);
  curl_setopt($cp, CURLOPT_HEADER, 0);
 
  curl_exec($rfp);
 
  $errno = curl_errno($rfp);
  $errmsg = curl_error($rfp);
 
  curl_close($rfp);
  fclose($fp); 
 
  if($errno){
    echo $errmsg;
    exit;
  }
}

本文章是关于appcan开发移动app与服务器端session的状态管理与交互例子,希望此开会例子可以帮助到大家的哦.

我们进行web开发的时候,一般使用cookie或session来保存用户的登录状态,通过检查cookie或session的数据来验证用户是否具有对某些需要登录的页面的访问权限,这一切都是通过浏览器来完成,这是b/s架构,但是,假如客户端是移动应用端,那该怎么办?因为这是c/s架构,无法使用使用cookie或session来检验用户的状态,此时的情况就好像浏览器禁用了cookie。

庆幸的是,这是有解决方法的,在禁用cookie的情况下,可以通过query_string来传递session_id,即在app发送登录请求后,服务器端可以通过传递session_id到app,然后app保存session_id在移动设备上,在那些需要登录访问权限的功能,每一次交互请求附带参数session_id,传送到服务器端,再由服务器端检查session_id的合法性来确定该用户是否已登录。

以下是一个简单的移动开发示例,并没有使用原生的,而是使用appcan来构建app:

1. app登录请求:

var url = 'http://127.0.0.1:8080/index.php?act=login&email=aa@qq.com&pwd=123456'; 
$.getJSON(url,function(res){
 if(res.ok == 'yes'){
  var storage = window.localStorage;
  if(storage) storage.setItem('sid',res.session_id);
 }else{
  uexWindow.toast(0, 5, '登录失败!', 4000);
  return;
 }  
}, 'json',null, 'POST', '', '');

2. app请求用户信息:

var sid = '';
var storage = window.localStorage;
if(storage) sid = storage.getItem('sid');
var url = 'http://127.0.0.1:8080/index.php?act=uinfo&session_id='+sid; 
$.getJSON(url,function(res){
 if(res.ok == 'yes'){
  var uname = res.username;
  uexWindow.toast(0, 5, '用户名:'+uname, 4000);
  return;
 }else{
  uexWindow.toast(0, 5, '请先登录!', 4000);
  return;
 }  
}, 'json',null, 'POST', '', '');

3. 服务器端php响应请求[index.php]:

<?php
/**
 * User: wudiweb.com
 * app与服务器端简单示例
 */
header("Content-Type: text/html; charset='utf-8'");
session_start();
 
$act = $_REQUEST['act'];
$result = array('ok' => 'yes');
 
if($act == 'login'){
    $email = $_REQUEST['email'];
    $pwd = $_REQUEST['pwd'];
 
    if($email == 'aa@qq.com' && $pwd == '123456'){
        $result['session_id'] = session_id();
    }else{
        $result['ok'] = 'no';
    }
}elseif($act == 'uinfo'){
    $session_id = $_REQUEST['session_id'];
    if($session_id == session_id()){
        $result['username'] = 'Wudiweb';
    }else{
        $result['ok'] = 'no';
    }
}
 
echo json_encode($result);
exit;

注意,这只是一个简单的用法,如果你认为不够完善,可以在此基础上进行扩展,例如加密session_id等。

[!--infotagslink--]

相关文章

  • PHP session_start()很慢问题分析与解决办法

    本文章来给各位同学介绍一下关于PHP session_start()很慢问题分析与解决办法,希望碰到此问题的同学可进入参考。 最近在做东西的时候发现一个问题 有一个接口挂...2016-11-25
  • php中json_decode()和json_encode()用法与中文不显示解决办法

    本文章介绍了关于php中json_decode()和json_encode()用法与中文不显示解决办法,有需要的朋友可以参考一下下。 php中json_decode()和json_encode() 1.json_decode(...2016-11-25
  • phpexcel导出数据身份证后四位0000解决办法

    在php中我们如果要导入excel数据我们通常会使用phpexcel插件了,但是有朋友会发与使用phpexcel导出数据出现身份证后四位是0000情况了,下面我们就来看解决办法。 最...2016-11-25
  • 401错误码代表什么 401错误解决办法

    401是HTTP状态码的一种,属于“请示错误”,表示请求可能出错,已妨碍了服务器对请求的处理。具体的401错误是指:未授权,请求要求进行身份验证。登录后,服务器可能会返回对页面...2017-01-22
  • apache网站提示503错误解决办法

    Apache status 503 的原因大致有如下几种情况 : 1、 CPU 负载过高,服务器响应不过来,返回503 2、 系统连接数超限,超过MaxVhostClients的上限,返回503 3、 单IP连接数超限,超过M...2016-01-28
  • Perl CPAN::Modulelist的解决办法

    今天用CPAN安装Term::ReadLine,报了个这样的错误 Going to read /root/.cpan/sources/modules/03modlist.data.gz Can't locate object method "data" via package "C...2016-11-25
  • phpStudy访问速度慢和启动失败的解决办法

    下面给大家介绍phpstudy访问速度慢的解决办法。1、修改mysql数据库链接地址为ip地址127.0.0.1。2、使用最新版本,这个坑了我好久时间。下面一段内容是关于phpstudy启动失败的解决办法。php5.3、5.4和apache都是用vc9编...2015-11-24
  • PHP Curl出现403错误的解决办法

    自己用的小PHP应用,使用curl抓网页下来处理,为了穿墙方便,使用Privoxy作为代理,便于选择哪些网站使用proxy、哪些不用。但今天却遇到了奇怪的问题,访问google baidu这些网站居然都返回403错误,而访问其他的一些网站没事,如果...2014-05-31
  • 分享一段php获取linux服务器状态的代码

    简单的php获取linux服务器状态的代码,不多说-直接上函数:复制代码 代码如下:function get_used_status(){ $fp = popen('top -b -n 2 | grep -E "^(Cpu|Mem|Tasks)"',"r");//获取某一时刻系统cpu和内存使用情况 $rs =...2014-05-31
  • Springboot+TCP监听服务器搭建过程图解

    这篇文章主要介绍了Springboot+TCP监听服务器搭建过程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-10-28
  • PHP判断上传文件类型的解决办法

    分享给大家php判断上传文件类型的方法,大家一起学习学习。/** * 读取文件前几个字节 判断文件类型 * @return String */ function checkTitle($filename){ $file=fopen($filename, "rb"); $bin=fread($file, 2); /...2015-10-21
  • android.os.BinderProxy cannot be cast to com解决办法

    本文章来给大家介绍关于android.os.BinderProxy cannot be cast to com解决办法,希望此文章对各位有帮助呀。 Android在绑定服务的时候出现java.lang.ClassCastExc...2016-09-20
  • MYSQL数据库使用UTF-8中文编码乱码的解决办法

    1.用phpmyadmin创建数据库和数据表 创建数据库的时候,请将“整理”设置为:“utf8_general_ci” 或执行语句: 复制代码 代码如下:CREATE DATABASE `dbname` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 创...2015-10-21
  • 服务器 UDP端口占用几千个的解决办法

    前一段时间使用NetStat命令查看服务器端口时,发现服务器udp端口开放了好多,最少在1000个以上,当时事情比较多,没有管它,今天终于有点时间,仔细检查了一下,排除了这个问题. ...2016-01-27
  • php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法

    最近遇到一个问题,就是在使用php的mail函数发送utf-8编码的中文邮件时标题出现乱码现象,而邮件正文却是正确的。最初以为是页面编码的问题,发现页面编码utf-8没有问题啊,找了半天原因,最后找到了问题所在。 1.使用 PEAR 的...2015-10-21
  • PHP页面转UTF-8中文编码乱码的解决办法

    对于乱码这个问题php开发者几乎都会有碰到过,我们下面主要是介绍了php文件乱码和页面乱码。PHP页面转UTF-8编码问题 1.在代码开始出加入一行: header("Content-Type: text/html;charset=utf-8"); 2.PHP文件编码问题...2015-10-21
  • PHP连接公司内部服务器的MYSQL数据库的简单实例

    “主机,用户名,密码”得到连接、“数据库,sql,连接”得到结果,最后是结果的处理显示。当然,数据库连接是扩展库为我们完成的,我们能做的仅仅是处理结果而已。...2013-09-29
  • 解决HttpPost+json请求---服务器中文乱码及其他问题

    这篇文章主要介绍了解决HttpPost+json请求---服务器中文乱码及其他问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-22
  • Android开发之PhoneGap打包及错误解决办法

    下面来给各位简单的介绍一下关于Android开发之PhoneGap打包及错误解决办法,希望碰到此类问题的同学可进入参考一下哦。 在我安装、配置好PhoneGap项目的所有依赖...2016-09-20
  • Ubuntu15下mysql5.6.25不支持中文的解决办法

    apt-get install 安装的,不是源码包安装的mysql1 修改mysql的配置文件/etc/mysql/conf.d/mysql.cnf在[mysql]的下方加入如下语句:(注:这个文件下没有配置,只有【mysql】)no-auto-rehash default-character-set=utf8/etc/...2015-10-21