phplig(php里骨架屏调用)
华为云服务器特价优惠火热进行中! 2核2G2兆仅需 38 元;4核4G3兆仅需 79 元。购买时间越长越优惠!更多配置及优惠价格请咨询客服。
合作流程: |
本篇文章给大家谈谈phplig,以及php里骨架屏调用对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
微信号:cloud7591如需了解更多,欢迎添加客服微信咨询。
复制微信号
本文目录一览:
- 1、lec什么意思
- 2、api文档怎么写? api接口我已经写好了但时文档不太会写 还有编写api文档有什么作用 请各位高手大虾指点迷津
- 3、Ldap有哪些标准?
- 4、lg公司简介,让电子产业风靡世界
- 5、php代码加密怎么解密?
- 6、几种常见的PHP超时处理方法
lec什么意思
lec是英雄联盟欧洲冠军联赛。
英雄联盟欧洲冠军联赛(League of Legends European Championship , LEC)是英雄联盟在欧洲地区的最高级别职业联赛。
LEC联赛每年分为春季赛和夏季赛两个赛期,每个赛期分为常规赛和季后赛,同时LEC联赛是欧洲赛区通往每年赛季中期的英雄联盟季中冠军赛和赛季末期的英雄联盟全球总决赛的唯一渠道。

api文档怎么写? api接口我已经写好了但时文档不太会写 还有编写api文档有什么作用 请各位高手大虾指点迷津
很多扩展类,框架。PHP有第三方的函数库。DELPHI则是控件。其实这体现了“软件工程”中代码重用的思想。任何好的,工业生产级别的语言都会有很多的扩展支持的。如果,每个体统都需要从底层一点一点的敲代码。是很浪费的。DELPHI整个体系的思想是很优秀的。被很多语言工具借鉴。比如.NET。而且DELPHI是开源的。这些控件,都是优秀的学习资料。 祝你好运
Ldap有哪些标准?
分类: 电脑/网络 程序设计 其他编程语言
问题描述:
急求,谢谢!
解析:
什么是LDAP?
LDAP的英文全称是Ligheight Directory Access Protocol,一般都简称为LDAP。它是基于X.500标准的,
但是简单多了并且可以根据需要定制。与X.500不同,LDAP支持TCP/IP,这对访问Inter是必须的。LDAP
的核心规范在RFC中都有定义,所有与LDAP相关的RFC都可以在LDAPman RFC网页中找到。现在LDAP技术不仅
发展得很快而且也是激动人心的。在企业范围内实现LDAP可以让运行在几乎所有计算机平台上的所有的应
用程序从LDAP目录中获取信息。LDAP目录中可以存储各种类型的数据:电子邮件地址、邮件路由信息、人力
资源数据、公用密匙、联系人列表,等等。通过把LDAP目录作为系统集成中的一个重要环节,可以简化员工
在企业内部查询信息的步骤,甚至连主要的数据源都可以放在任何地方。
LDAP目录的优势
如果需要开发一种提供公共信息查询的系统一般的设计方法可能是采用基于WEB的数据库设计方式,即前端
使用浏览器而后端使用WEB服务器加上关系数据库。后端在Windows的典型实现可能是Windows NT + IIS + Acess
数据库或者是SQL服务器,IIS和数据库之间通过ASP技术使用ODBC进行连接,达到通过填写表单查询数据的功能;
后端在Linux系统的典型实现可能是Linux+ Apache + postgresql,Apache和数据库之间通过PHP3提供的函数进
行连接。使用上述方法的缺点是后端关系数据库的引入导致系统整体的性能降低和系统的管理比较繁琐,因为需
要不断的进行数据类型的验证和事务的完整性的确认;并且前端用户对数据的控制不够灵活,用户权限的设置一
般只能是设置在表一级而不是设置在记录一级。
目录服务的推出主要是解决上述数据库中存在的问题。目录与关系数据库相似,是指具有描述性的基于属性的记
录 *** ,但它的数据类型主要是字符型,为了检索的需要添加了BIN(二进制数据)、CIS(忽略大小写)、CES
(大小写敏感)、TEL(电话型)等语法(Syntax),而不是关系数据库提供的整数、浮点数、日期、货币等类型,
同样也不提供象关系数据库中普遍包含的大量的函数,它主要面向数据的查询服务(查询和修改操作比一般是大于
10:1),不提供事务的回滚(rollback)机制,它的数据修改使用简单的锁定机制实现All-or-Nothing,它的目标
是快速响应和大容量查询并且提供多目录服务器的信息复制功能。
现在该说说LDAP目录到底有些什么优势了。现在LDAP的流行是很多因数共同作用的结果。可能LDAP最大的优势是:
可以在任何计算机平台上,用很容易获得的而且数目不断增加的LDAP的客户端程序访问LDAP目录。而且也很容易
定制应用程序为它加上LDAP的支持。
LDAP协议是跨平台的和标准的协议,因此应用程序就不用为LDAP目录放在什么样的服务器上操心了。实际上,LDAP
得到了业界的广泛认可,因为它是Inter的标准。产商都很愿意在产品中加入对LDAP的支持,因为他们根本不用
考虑另一端(客户端或服务端)是怎么样的。LDAP服务器可以是任何一个开发源代码或商用的LDAP目录服务器(或
者还可能是具有LDAP界面的关系型数据库),因为可以用同样的协议、客户端连接软件包和查询命令与LDAP服务器
进行交互。与LDAP不同的是,如果软件产商想在软件产品中集成对DBMS的支持,那么通常都要对每一个数据库服务
器单独定制。不象很多商用的关系型数据库,你不必为LDAP的每一个客户端连接或许可协议付费 大多数的LDAP服务
器安装起来很简单,也容易维护和优化。
LDAP服务器可以用“推”或“拉”的方法复制部分或全部数据,例如:可以把数据“推”到远程的办公室,以增加
数据的安全性。复制技术是内置在LDAP服务器中的而且很容易配置。如果要在DBMS中使用相同的复制功能,数据库
产商就会要你支付额外的费用,而且也很难管理。
LDAP允许你根据需要使用ACI(一般都称为ACL或者访问控制列表)控制对数据读和写的权限。例如,设备管理员可
以有权改变员工的工作地点和办公室号码,但是不允许改变记录中其它的域。ACI可以根据谁访问数据、访问什么数
据、数据存在什么地方以及其它对数据进行访问控制。因为这些都是由LDAP目录服务器完成的,所以不用担心在客
户端的应用程序上是否要进行安全检查。
LDAP(Ligheight Directory Acess Protocol)是目录服务在TCP/IP上的实现(RFC 1777 V2版和RFC 2251
V3版)。它是对X500的目录协议的移植,但是简化了实现方法,所以称为轻量级的目录服务。在LDAP中目录是按照
树型结构组织,目录由条目(Entry)组成,条目相当于关系数据库中表的记录;条目是具有区别名DN(Distinguished
Name)的属性(Attribute) *** ,DN相当于关系数据库表中的关键字(Primary
Key);属性由类型(Type)和多个值(Values)组成,相当于关系数据库中的域(Field)由域名和数据类型组成,
只是为了方便检索的需要,LDAP中的Type可以有多个Value,而不是关系数据库中为降低数据的冗余性要求实现的各
个域必须是不相关的。LDAP中条目的组织一般按照地理位置和组织关系进行组织,非常的直观。LDAP把数据存放在
文件中,为提高效率可以使用基于索引的文件数据库,而不是关系数据库。LDAP协议集还规定了DN的命名方法、存
取控制方法、搜索格式、复制方法、URL格式、开发接口等
LDAP对于这样存储这样的信息最为有用,也就是数据需要从不同的地点读取,但是不需要经常更新。
例如,这些信息存储在LDAP目录中是十分有效的:
l 公司员工的电话号码簿和组织结构图
l 客户的联系信息
l 计算机管理需要的信息,包括NIS映射、email假名,等等
l 软件包的配置信息
l 公用证书和安全密匙
什么时候该用LDAP存储数据
大多数的LDAP服务器都为读密集型的操作进行专门的优化。因此,当从LDAP服务器中读取数据的时候会比从专门为
OLTP优化的关系型数据库中读取数据快一个数量级。也是因为专门为读的性能进行优化,大多数的LDAP目录服务器
并不适合存储需要需要经常改变的数据。例如,用LDAP服务器来存储电话号码是一个很好的选择,但是它不能作为
电子商务站点的数据库服务器。
如果下面每一个问题的答案都是“是”,那么把数据存在LDAP中就是一个好主意。
l 需要在任何平台上都能读取数据吗?
l 每一个单独的记录项是不是每一天都只有很少的改变?
l 可以把数据存在平面数据库(flat database)而不是关系型数据库中吗?换句话来说,也就是不管什么范式不
范式的,把所有东西都存在一个记录中(差不多只要满足第一范式)。
最后一个问题可能会唬住一些人,其实用平面数据库去存储一些关系型的数据也是很一般的。例如,一条公司员工
的记录就可以包含经理的登录名。用LDAP来存储这类信息是很方便的。一个简单的判断方法:如果可以把保数据存
在一张张的卡片里,就可以很容易地把它存在LDAP目录里。
安全和访问控制
LDAP提供很复杂的不同层次的访问控制或者ACI。因这些访问可以在服务器端控制,这比用客户端的软件保证数据的
安全可安全多了。
用LDAP的ACI,可以完成:
l 给予用户改变他们自己的电话号码和家庭地址的权限,但是限制他们对其它数据(如,职务名称,经理的登录名,
等等)只有“只读”权限。
l 给予“HR-admins"组中的所有人权限以改变下面这些用户的信息:经理、工作名称、员工号、部门名称和部门号。
但是对其它域没有写权限。
l 禁止任何人查询LDAP服务器上的用户口令,但是可以允许用户改变他或她自己的口令。
l 给予经理访问他们上级的家庭电话的只读权限,但是禁止其他人有这个权限。
l 给予“host-admins"组中的任何人创建、删除和编辑所有保存在LDAP服务器中的与计算机主机有关的信息
l 通过Web,允许“foobar-sales"组中的成员有选择地给予或禁止他们自己读取一部分客户联系数据的读权限。这
将允许他们把客户联系信息下载到本地的笔记本电脑或个人数字助理(PDA)上。(如果销售人员的软件都支持LDAP,
这将非常有用)
l 通过Web,允许组的所有者删除或添加他们拥有的组的成员。例如:可以允许销售经理给予或禁止销售人员改变Web
页的权限。也可以允许邮件假名(mail aliase)的所有者不经过IT技术人员就直接从邮件假名中删除或添加用户。
“公用”的邮件列表应该允许用户从邮件假名中添加或删除自己(但是只能是自己)。也可以对IP地址或主机名加以
限制。例如,某些域只允许用户IP地址以192.168.200.*开头的有读的权限,或者用户反向查找DNS得到的主机名必须
为*.foobar。
LDAP目录树的结构
LDAP目录以树状的层次结构来存储数据。如果你对自顶向下的DNS树或UNIX文件的目录树比较熟悉,也就很容易掌握
LDAP目录树这个概念了。就象DNS的主机名那样,LDAP目录记录的标识名(Distinguished Name,简称DN)是用来读取
单个记录,以及回溯到树的顶部。后面会做详细地介绍。
为什么要用层次结构来组织数据呢?原因是多方面的。下面是可能遇到的一些情况:
l 如果你想把所有的美国客户的联系信息都“推”到位于到西雅图办公室(负责营销)的LDAP服务器上,但是你不想
把公司的资产管理信息“推”到那里。
l 你可能想根据目录树的结构给予不同的员工组不同的权限。在下面的例子里,资产管理组对“asset-mgmt"部分有完
全的访问权限,但是不能访问其它地方。
l 把LDAP存储和复制功能结合起来,可以定制目录树的结构以降低对WAN带宽的要求。位于西雅图的营销办公室需要每
分钟更新的美国销售状况的信息,但是欧洲的销售情况就只要每小时更新一次就行了。
刨根问底:基准DN
LDAP目录树的最顶部就是根,也就是所谓的“基准DN"。基准DN通常使用下面列出的三种格式之一。假定我在名为FooBar
的电子商务公司工作,这家公司在Inter上的名字是foobar。
o="FooBar, Inc.", c=US
(以X.500格式表示的基准DN)
在这个例子中,o=FooBar, Inc. 表示组织名,在这里就是公司名的同义词。c=US 表示公司的总部在美国。以前,一般
都用这种方式来表示基准DN。但是事物总是在不断变化的,现在所有的公司都已经(或计划)上Inter上。随着
Inter的全球化,在基准DN中使用国家代码很容易让人产生混淆。现在,X.500格式发展成下面列出的两种格式。
o=foobar
(用公司的Inter地址表示的基准DN)
这种格式很直观,用公司的域名作为基准DN。这也是现在最常用的格式。
dc=foobar, dc=
(用DNS域名的不同部分组成的基准DN)
就象上面那一种格式,这种格式也是以DNS域名为基础的,但是上面那种格式不改变域名(也就更易读),而这种格式
把域名:foobar分成两部分 dc=foobar, dc=。在理论上,这种格式可能会更灵活一点,但是对于最终用户来说
也更难记忆一点。考虑一下foobar这个例子。当foobar和gizmo合并之后,可以简单的把“dc="当作基
准DN。把新的记录放到已经存在的dc=gizmo, dc=目录下,这样就简化了很多工作(当然,如果foobar和wocket.edu
合并,这个方法就不能用了)。如果LDAP服务器是新安装的,我建议你使用这种格式。再请注意一下,如果你打算使用活动
目录(Actrive Directory),Microsoft已经限制你必须使用这种格式。
更上一层楼:在目录树中怎么组织数据
在UNIX文件系统中,最顶层是根目录(root)。在根目录的下面有很多的文件和目录。象上面介绍的那样,LDAP目录也是
用同样的方法组织起来的。
在根目录下,要把数据从逻辑上区分开。因为历史上(X.500)的原因,大多数LDAP目录用OU从逻辑上把数据分开来。OU
表示“Organization Unit",在X.500协议中是用来表示公司内部的机构:销售部、财务部,等等。现在LDAP还保留ou=这
样的命名规则,但是扩展了分类的范围,可以分类为:ou=people, ou=groups, ou=devices,等等。更低一级的OU有时用
来做更细的归类。例如:LDAP目录树(不包括单独的记录)可能会是这样的:
dc=foobar, dc=
ou=customers
ou=asia
ou=europe
ou=usa
ou=employees
ou=rooms
ou=groups
ou=assets-mgmt
ou=nisgroups
ou=recipes
单独的LDAP记录
DN是LDAP记录项的名字
在LDAP目录中的所有记录项都有一个唯一的“Distinguished Name",也就是DN。每一个LDAP记录项的DN是由两个部分
组成的:相对DN(RDN)和记录在LDAP目录中的位置。
RDN是DN中与目录树的结构无关的部分。在LDAP目录中存储的记录项都要有一个名字,这个名字通常存在(Common Name)
这个属性里。因为几乎所有的东西都有一个名字,在LDAP中存储的对象都用它们的值作为RDN的基础。如果我把最喜欢的
吃燕麦粥食谱存为一个记录,我就会用=Oatmeal Deluxe作为记录项的RDN。
l 我的LDAP目录的基准DN是dc=foobar,dc=
l 我把自己的食谱作为LDAP的记录项存在ou=recipes
l 我的LDAP记录项的RDN设为=Oatmeal Deluxe
上面这些构成了燕麦粥食谱的LDAP记录的完整DN。记住,DN的读法和DNS主机名类似。下面就是完整的DN:
=Oatmeal Deluxe,ou=recipes,dc=foobar,dc=
举一个实际的例子来说明DN
现在为公司的员工设置一个DN。可以用基于或uid(User ID),作为典型的用户帐号。例如,FooBar的员工Fran Smith
(登录名:f *** ith)的DN可以为下面两种格式:
uid=f *** ith,ou=employees,dc=foobar,dc=
(基于登录名)
LDAP(以及X.500)用uid表示“User ID",不要把它和UNIX的uid号混淆了。大多数公司都会给每一个员工唯一的登录名,
因此用这个办法可以很好地保存员工的信息。你不用担心以后还会有一个叫Fran Smith的加入公司,如果Fran改变了她的
名字(结婚?离婚?或宗教原因?),也用不着改变LDAP记录项的DN。
=Fran Smith,ou=employees,dc=foobar,dc=
(基于姓名)
可以看到这种格式使用了Common Name(CN)。可以把Common Name当成一个人的全名。这种格式有一个很明显的缺点就是:
如果名字改变了,LDAP的记录就要从一个DN转移到另一个DN。但是,我们应该尽可能地避免改变一个记录项的DN。
定制目录的对象类型
你可以用LDAP存储各种类型的数据对象,只要这些对象可以用属性来表示,下面这些是可以在LDAP中存储的一些信息:
l 员工信息:员工的姓名、登录名、口令、员工号、他的经理的登录名,邮件服务器,等等。
l 物品跟踪信息:计算机名、IP地址、标签、型号、所在位置,等等。
l 客户联系列表:客户的公司名、主要联系人的电话、传真和电子邮件,等等。
l 会议厅信息:会议厅的名字、位置、可以坐多少人、电话号码、是否有投影机。
l 食谱信息:菜的名字、配料、烹调方法以及准备方法。
因为LDAP目录可以定制成存储任何文本或二进制数据,到底存什么要由你自己决定。LDAP目录用对象类型
(object classes)的概念来定义运行哪一类的对象使用什么属性。在几乎所有的LDAP服务器中,你都要根据
自己的需要扩展基本的LDAP目录
的功能,创建新的对象类型或者扩展现存的对象类型。
LDAP目录以一系列“属性对”的形式来存储记录项,每一个记录项包括属性类型和属性值(这与关系型数据库
用行和列来存取数据有根本的不同)。下面是我存在LDAP目录中的一部分食谱记录:
dn: =Oatmeal Deluxe, ou=recipes, dc=foobar, dc=
: Instant Oatmeal Deluxe
recipeCuisine: breakfast
recipeIngredient: 1 packet instant oatmeal
recipeIngredient: 1 cup water
recipeIngredient: 1 pinch salt
recipeIngredient: 1 tsp brown sugar
recipeIngredient: 1/4 apple, any type
请注意上面每一种配料都作为属性recipeIngredient值。LDAP目录被设计成象上面那样为一个属性保存多个值的,
而不是在每一个属性的后面用逗号把一系列值分开。
因为用这样的方式存储数据,所以数据库就有很大的灵活性,不必为加入一些新的数据就重新创建表和索引。更
重要的是,LDAP目录不必花费内存或硬盘空间处理“空”域,也就是说,实际上不使用可选择的域也不会花费你
任何资源。
作为例子的一个单独的数据项
让我们看看下面这个例子。我们用Foobar, Inc.的员工Fran Smith的LDAP记录。这个记录项的格式是LDIF,用来
导入和导出LDAP目录的记录项。
dn: uid=f *** ith, ou=employees, dc=foobar, dc=
objectclass: person
objectclass: anizationalPerson
objectclass: iOrgPerson
objectclass: foobarPerson
uid: f *** ith
givenname: Fran
sn: Smith
: Fran Smith
: Frances Smith
telephonenumber: 510-555-1234
roomnumber: 122G
o: Foobar, Inc.
mailRoutingAddress: f *** ith@foobar
mailhost: mail.foobar
userpassword: 3x1231v76T89N
uidnumber: 1234
gidnumber: 1200
homedirectory: /home/f *** ith
loginshell: /usr/local/bin/bash
属性的值在保存的时候是保留大小写的,但是在默认情况下搜索的时候是不区分大小写的。某些特殊的属性
(例如,password)在搜索的时候需要区分大小写。
让我们一点一点地分析上面的记录项。
dn: uid=f *** ith, ou=employees, dc=foobar, dc=
这是Fran的LDAP记录项的完整DN,包括在目录树中的完整路径。LDAP(和X.500)使用uid(User ID),不要
把它和UNIX的uid号混淆了。
objectclass: person
objectclass: anizationalPerson
objectclass: iOrgPerson
objectclass: foobarPerson
可以为任何一个对象根据需要分配多个对象类型。person对象类型要求(mon name)和sn(surname)
这两个域不能为空。persion对象类型允许有其它的可选域,包括givenname、telephonenumber,等等。
anizational Person给person加入更多的可选域,iOrgPerson又加入更多的可选域(包括电子邮件信息)。
最后,foobarPerson是为Foobar定制的对象类型,加入了很多定制的属性。
uid: f *** ith
givenname: Fran
sn: Smith
: Fran Smith
: Frances Smith
telephonenumber: 510-555-1234
roomnumber: 122G
o: Foobar, Inc.
以前说过了,uid表示User ID。当看到uid的时候,就在脑袋里想一想“login"。
请注意CN有多个值。就象上面介绍的,LDAP允许某些属性有多个值。为什么允许有多个值呢?假定你在用
公司的LDAP服务器查找Fran的电话号码。你可能只知道她的名字叫Fran,但是对人力资源处的人来说她的
正式名字叫做Frances。因为保存了她的两个名字,所以用任何一个名字检索都可以找到Fran的电话号码、
电子邮件和办公房间号,等等。
mailRoutingAddress: f *** ith@foobar
mailhost: mail.foobar
就象现在大多数的公司都上网了,Foobar用Sendmail发送邮件和处理外部邮件路由信息。Foobar把所有用户
的邮件信息都存在LDAP中。最新版本的Sendmail支持这项功能。
Userpassword: 3x1231v76T89N
uidnumber: 1234
gidnumber: 1200
gecos: Frances Smith
homedirectory: /home/f *** ith
loginshell: /usr/local/bin/bash
注意,Foobar的系统管理员把所有用户的口令映射信息也都存在LDAP中。FoobarPerson类型的对象具有这
种能力。再注意一下,用户口令是用UNIX的口令加密格式存储的。UNIX的uid在这里为uidnumber。提醒你一下,
关于如何在LDAP中保存NIS信息,有完整的一份RFC。在以后的文章中我会谈一谈NIS的集成。
LDAP复制
LDAP服务器可以使用基于“推”或者“拉”的技术,用简单或基于安全证书的安全验证,复制一部分或者所
有的数据。
例如,Foobar有一个“公用的”LDAP服务器,地址为ldap.foobar,端口为389。Netscape Communicator
的电子邮件查询功能、UNIX的“ph"命令要用到这个服务器,用户也可以在任何地方查询这个服务器上的员工
和客户联系信息。公司的主LDAP服务器运行在相同的计算机上,不过端口号是1389。
你可能即不想让员工查询资产管理或食谱的信息,又不想让信息技术人员看到整个公司的LDAP目录。为了解决
这个问题,Foobar有选择地把子目录树从主LDAP服务器复制到“公用”LDAP服务器上,不复制需要隐藏的信息。
为了保持数据始终是最新的,主目录服务器被设置成即时“推”同步。这些种方法主要是为了方便,而不是安全,
因为如果有权限的用户想查询所有的数据,可以用另一个LDAP端口。
假定Foobar通过从奥克兰到欧洲的低带宽数据的连接用LDAP管理客户联系信息。可以建立从ldap.foobar:1389
到munich-ldap.foobar:389的数据复制,象下面这样:
periodic pull: ou=asia,ou=customers,o=sendmail
periodic pull: ou=us,ou=customers,o=sendmail
immediate push: ou=europe,ou=customers,o=sendmail
“拉”连接每15分钟同步一次,在上面假定的情况下足够了。“推”连接保证任何欧洲的联系信息发生了变化就
立即被“推”到Munich。
用上面的复制模式,用户为了访问数据需要连接到哪一台服务器呢?在Munich的用户可以简单地连接到本地服务
器。如果他们改变了数据,本地的LDAP服务器就会把这些变化传到主LDAP服务器。然后,主LDAP服务器把这些变化
“推”回本地的“公用”LDAP服务器保持数据的同步。这对本地的用户有很大的好处,因为所有的查询(大多数是读)都在本地的服务器上进行,速度非常快。当需要改变信息的时候,最终用户不需要重新配置客户端的软件,因为LDAP目录服务器为他们完成了所有的数据交换工作。
lg公司简介,让电子产业风靡世界
一个正确的选择是您幸福生活的开始,我们在选择的时候不仅要物美价廉,还要重视商品的质量,以防出现问题时可以及时方便的去解决,避免给我们的日常生活带来不必要的困扰!小编在这极力推荐LG,选择lg,就是生活高端的保障,就是在电子化选择的一个正确规律。小编家中的电脑也是LG公司的呢,在这里选择LG,给你十二分的省心/放心/安心!
1945年,刚从日本殖民统治下解放出来,资本主义开始萌芽的韩国,开辟化学与电子产业的新纪元,为LG集团的两大支柱产业化学和电气电子产业奠定了基础 。
LG集团的创始人莲庵具仁会于1947年创建了乐喜化学工业社(现LG化学),从此在一穷二白的这片土地上开始谱写了LG集团的历史。
LG集团通过生产化妆品“乐喜乳霜”,开始了企业经营活动。为了研发不易破碎的化妆品瓶盖,LG集团在韩国首次打入塑料产业领域。
朝鲜战争爆发的1952年,LG集团在没有不屈不挠的意志和坚强的企业精神,就无法扩展事业的情况下做出了这一决策。
LG集团先后生产出梳子、香皂盒、牙刷、餐具等塑料产品,为提高国民生活水平做出了贡献。
LG集团于1954年凭借自主技术成功地开发出韩国最早的牙膏,战胜了美国“高露洁牙膏”,迅速占领了韩国国内市场,为提高国民的健康水平做出了贡献。
LG集团于1959年成立了乐喜油脂,开始了香皂和甘油的生产。
同时,LG集团在扩大塑料产业领域的过程中,于1958年成立了金星社(LG电子),并于1959年生产出韩国第一台 第一台真空管式收音机A-501,开辟了韩国电子产业的新纪元,设立了韩国国内第一家综合电子产品工厂。借此,LG集团于上个世纪50年代,就已经奠定了其企业活动的两大支柱化学和电气电子产业的基础,为韩国产业发展发挥了排头兵的作用。
1962年,LG集团成立了韩国电缆工业(现LG电缆),扩大了电气.电子产业领域。1967年,LG集团成立了韩国首家民营炼油厂湖南炼油(现GS Caltex),打入基础原料产业领域,为其进军重化学工业奠定了基础。 此外,乐喜化学(现LG化学)于1964年生产出韩国最早的合成洗涤剂“HAITAI”,还于1967年生产出厨房洗涤剂和液体洗发剂“洗发膏”。
金星社(现LG电子)分别于1960年、1965年、1966年、1969年在韩国率先生产出电风扇、冰箱、黑白电视机、空调、洗衣机和电梯等产品,销售额突破了100亿韩元大关,公司创立仅10年,便获得了239倍的飞跃发展。至此,LG集团跻身于化学、能源、电气、电子产业的韩国龙头企业,迎来了充满希望的70年代。
70年代,韩国通过出口主导型政策,推动经济快速发展,进入新兴工业国的行列。
然而,70年代经历了两次世界石油危机,再加上韩国国内政局动荡,使得经营环境日益恶化。
1969年12月31日,LG集团创始人具仁会会长与世长辞,具滋暻就任第二代会长,迎来了70年代。具滋暻会长上任后表示“70年代是LG集团走向国际化的转折时期”,决定把扎扎实实的发展政策和国际化,制定为70年代的主要政策。
为此,LG集团将1970年和1971年确定为“经营稳定年”,夯实了扎实的经营基础。1972年,乐喜化学(现LG化学)销售额突破11亿韩元,出口额达到530万美元;金星社(现LG电子)电子产品的出口实绩,比前一年增加了170%;湖南炼油(现GS Caltex完成了第一期和第二期扩建工程,工厂启动仅3年就把生产能力提高到3倍,从而奠定了主力企业发展基础。与此同时,LG集团于1970年接收凡韩火灾海上保险(现LIG)进军保险业,于1973年成立国际证券公司,开始涉足证券业等,成功地将事业领域由制造业扩展到服务业。
可以说,70年代,LG集团通过扎扎实实的发展,不断扩大事业领域,服务于社会,发展成为国民企业,树立了成熟的企业形象。
在化学与能源领域,LG集团以乐喜(现LG化学)于1983年后重点发展的石油化学工业为中心,不断深化和发展了塑料、生活用品、精密化学等已有领域,并重新进入化妆品行业,扩大合成产业的同时,进入医药品事业领域,实现了事业领域的多元化,并通过积极的海外投资,开始步入跨国企业的行列。
金星电线(现LG电缆)迅速实现了铜通信向光通信、普通电线向超高压特殊电线的转换,引领了电缆事业质的转换。
LG集团于1984 年成立了 LG Ad, 开始涉足综合广告事业领域,于1987 年接收了 Korean Express(现LG Card),成立了STM(现LG CNS),进入信用卡和电算系统专业事业领域。
迎接1987年LG集团成立40周年,LG集团竣工了汝矣岛LG双子大厦,进一步提升了集团的整体形象。1988年在墨西哥,泰国,埃及,菲律宾,意大利,英国设立生产基地。随后,LG集团又实施了“F-88计划”和“V计划”,制定了长期发展蓝图,坚决推行企业改革,迎来了90年代。
1990年,具滋暻会长发布了以组织结构与运营体制的改革、自律经营与人才培养为基础的“21世纪经营构想”、“为顾客创造价值,以人为本的经营”的新的经营理念,指明了LG集团的未来蓝图,确立了企业经营的理念基础。
1990年在印度尼西亚设立生产基地。
1992年在中国设立生产基地。
1995 年,为全力打造鲜明的企业形象,LG集团通过将集团名称更名为LG 等一系列CI修订工程,发动了面向全球化的引擎。继具滋暻会长之后具本茂就任LG集团第三代会长,开辟了新的LG集团时代,打响了第二次经营革新战役同时收购了美国杰尼斯公司。
至此,LG集团构建了以化学与能源、电子与信息通信、金融、服务等四大事业领域为核心的“21世纪型事业结构”。
国家发展改革委2013年1月4日发布消息称,该委对LG液晶面板企业合谋操纵液晶面板价格,在中国大陆实施价格垄断的行为进行了立案调查,并依法责令涉案企业退还国内彩电企业多付价款1.72亿元,没收3675万元,罚款1.44亿元,经济制裁总金额3.53亿元。
LG Display2013年宣布投资7063亿韩元(约合40.6亿元人民币)增设一条8.5代WRGB OLED电视面板生产线,并预计将于2014年上半年实现量产。这生产线的建成,标志着Oled正式进入大屏幕时代。
LG电子(LG Electronics Inc.)计划2013年11月推出柔性屏智能手机,以此和长期竞争对手三星电子(Samsung Electronics Co.)在一个新的领域展开竞争。
以上就是小编今天给大家带来的主要内容,Lg集团的出口额可是达到11兆3千亿韩元呢,仅次于三星之后的韩国第二大集团呢,如果大家再有什么不懂的问题可以自己去网上继续探索,遇到不懂的问题可是要不耻下问哦!做一个博学多识的人!希望小编对于lg公司的介绍能够给大家带来帮助,期盼您对lg更多一份的关注!
土巴兔在线免费为大家提供“各家装修报价、1-4家本地装修公司、3套装修设计方案”,还有装修避坑攻略!点击此链接:【;wb】,就能免费领取哦~
php代码加密怎么解密?
$key = "This is supposed to be a secret key !!!";
function keyED($txt,$encrypt_key)
{
$encrypt_key = md5($encrypt_key);
$ctr=0;
$tmp = "";
for ($i=0;$istrlen($txt);$i++) {
if ($ctr==strlen($encrypt_key)) $ctr=0;
$tmp.= substr($txt,$i,1) ^ substr($encrypt_key,$ctr,1);
$ctr++;
}
return $tmp;
}
function encrypt($txt,$key)
{
srand((double)microtime()*1000000);
$encrypt_key = md5(rand(0,32000));
$ctr=0;
$tmp = "";
for ($i=0;$istrlen($txt);$i++) {
if ($ctr==strlen($encrypt_key)) $ctr=0;
$tmp.= substr($encrypt_key,$ctr,1) .
(substr($txt,$i,1) ^ substr($encrypt_key,$ctr,1));
$ctr++;
}
return keyED($tmp,$key);
}
function decrypt($txt,$key)
{
$txt = keyED($txt,$key);
$tmp = "";
for ($i=0;$istrlen($txt);$i++) {
$md5 = substr($txt,$i,1);
$i++;
$tmp.= (substr($txt,$i,1) ^ $md5);
}
return $tmp;
}
$string = "Hello World !!!";
// encrypt $string, and store it in $enc_text
$enc_text = encrypt($string,$key);
// decrypt the encrypted text $enc_text, and store it in $dec_text
$dec_text = decrypt($enc_text,$key);
//加密
function str2hex($s)
{
$r = "";
$hexes = array ("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f");
for ($i=0; $istrlen($s); $i++) ="" $r .= ($hexes [(ord($s{$i}) 4)] . $hexes [(ord($s{$i}) 0xf)]);
return $r;
}
//解密
function hex2str($s)
{
$r = "";
for ( $i = 0; $istrlen($s); $i="" +="2) " {
$x1 = ord($s{$i});
$x1 = ($x1=48 $x158) ? $x1-48 : $x1-97+10;
$x2 = ord($s{$i+1});
$x2 = ($x2=48 $x258) ? $x2-48 : $x2-97+10;
$r .= chr((($x1 4) 0xf0) | ($x2 0x0f));
}
return $r;
}
echo str2hex("山东");
echo "
";
echo hex2str("c9bdb6ab");
?
几种常见的PHP超时处理方法
【Web服务器超时处理】
[ Apache ]
一般在性能很高的情况下,缺省所有超时配置都是30秒,但是在上传文件,或者网络速度很慢的情况下,那么可能触发超时操作。
目前apachefastcgiphp-fpm模式下有三个超时设置:
fastcgi超时设置:
修改的fastcgi连接配置,类似如下:
复制代码 代码如下:
IfModulemod_fastcgi.c
FastCgiExternalServer/home/forum/apache/apache_php/cgi-bin/php-cgi-socket/home/forum/php5/etc/php-fpm.sock
ScriptAlias/fcgi-bin/"/home/forum/apache/apache_php/cgi-bin/"
AddHandlerphp-fastcgi.php
Actionphp-fastcgi/fcgi-bin/php-cgi
AddTypeapplication/x-
/IfModule
缺省配置是30s,如果需要定制自己的配置,需要修改配置,比如修改为100秒:(修改后重启apache):
复制代码 代码如下:
IfModulemod_fastcgi.c
FastCgiExternalServer/home/forum/apache/apache_php/cgi-bin/php-cgi-socket/home/forum/php5/etc/php-fpm.sock-idle-timeout100
ScriptAlias/fcgi-bin/"/home/forum/apache/apache_php/cgi-bin/"
AddHandlerphp-fastcgi.php
Actionphp-fastcgi/fcgi-bin/php-cgi
AddTypeapplication/x-
/IfModule
如果超时会返回500错误,断开跟后端php服务的连接,同时记录一条apache错误日志:
[ThuJan2718:30:152011][error][client10.81.41.110]FastCGI:commwithserver"/home/forum/apache/apache_php/cgi-bin/php-cgi"aborted:idletimeout(30sec)
[ThuJan2718:30:152011][error][client10.81.41.110]FastCGI:incompleteheaders(0bytes)receivedfromserver"/home/forum/apache/apache_php/cgi-bin/php-cgi"
其他fastcgi配置参数说明:
复制代码 代码如下:
IdleTimeout发呆时限
ProcessLifeTime一个进程的最长生命周期,过期之后无条件kill
MaxProcessCount最大进程个数
DefaultMinClassProcessCount每个程序启动的最小进程个数
DefaultMaxClassProcessCount每个程序启动的最大进程个数
IPCConnectTimeout程序响应超时时间
IPCCommTimeout与程序通讯的最长时间,上面的错误有可能就是这个值设置过小造成的
MaxRequestsPerProcess每个进程最多完成处理个数,达成后自杀
[ Lighttpd ]
配置:lig
Lighttpd配置中,关于超时的参数有如下几个(篇幅考虑,只写读超时,写超时参数同理):
主要涉及选项:
server.max-keep-alive-idle=5
server.max-read-idle=60
server.read-timeout=0
server.max-connection-idle=360
复制代码 代码如下:
#每次keep-alive的最大请求数,默认值是16
server.max-keep-alive-requests=100
#keep-alive的最长等待时间,单位是秒,默认值是5
server.max-keep-alive-idle=1200
#lighttpd的work子进程数,默认值是0,单进程运行
server.max-worker=2
#限制用户在发送请求的过程中,最大的中间停顿时间(单位是秒),
#如果用户在发送请求的过程中(没发完请求),中间停顿的时间太长,lighttpd会主动断开连接
#默认值是60(秒)
server.max-read-idle=1200
#限制用户在接收应答的过程中,最大的中间停顿时间(单位是秒),
#如果用户在接收应答的过程中(没接完),中间停顿的时间太长,lighttpd会主动断开连接
#默认值是360(秒)
server.max-write-idle=12000
#读客户端请求的超时限制,单位是秒,配为0表示不作限制
#设置小于max-read-idle时,read-timeout生效
server.read-timeout=0
#写应答页面给客户端的超时限制,单位是秒,配为0表示不作限制
#设置小于max-write-idle时,write-timeout生效
server.write-timeout=0
#请求的处理时间上限,如果用了mod_proxy_core,那就是和后端的交互时间限制,单位是秒
server.max-connection-idle=1200
说明:
对于一个keep-alive连接上的连续请求,发送第一个请求内容的最大间隔由参数max-read-idle决定,从第二个请求起,发送请求内容的最大间隔由参数max-keep-alive-idle决定。请求间的间隔超时也由max-keep-alive-idle决定。发送请求内容的总时间超时由参数read-timeout决定。Lighttpd与后端交互数据的超时由max-connection-idle决定。
延伸阅读:
[ Nginx ]
配置:nf
复制代码 代码如下:
http{
#Fastcgi:(针对后端的fastcgi生效,fastcgi不属于proxy模式)
fastcgi_connect_timeout5;#连接超时
fastcgi_send_timeout10; #写超时
fastcgi_read_timeout10;#读取超时
#Proxy:(针对proxy/upstreams的生效)
proxy_connect_timeout15s;#连接超时
proxy_read_timeout24s;#读超时
proxy_send_timeout10s; #写超时
}
说明:
Nginx 的超时设置倒是非常清晰容易理解,上面超时针对不同工作模式,但是因为超时带来的问题是非常多的。
延伸阅读:
ml
ml
ml
【PHP本身超时处理】
[ PHP-fpm ]
配置:nf
复制代码 代码如下:
?xmlversion="1.0"?
configuration
//...
Setsthelimitonthenumberofsimultaneousrequeststhatwillbeserved.
EquivalenttoApacheMaxClientsdirective.
EquivalenttoPHP_FCGI_CHILDRENenvironmentinoriginalphp.fcgi
Usedwithanypm_style.
#php-cgi的进程数量
valuename="max_children"128/value
Thetimeout(inseconds)forservingasinglerequestafterwhichtheworkerprocesswillbeterminated
Shouldbeusedwhen'max_execution_time'inioptiondoesnotstopscriptexecutionforsomereason
'0s'means'off'
#php-fpm 请求执行超时时间,0s为永不超时,否则设置一个 Ns 为超时的秒数
valuename="request_terminate_timeout"0s/value
Thetimeout(inseconds)forservingofsinglerequestafterwhichaphpbacktracewillbedumpedtoslow.logfile
'0s'means'off'
valuename="request_slowlog_timeout"0s/value
/configuration
说明:
在php.ini中,有一个参数max_execution_time可以设置PHP脚本的最大执行时间,但是,在php-cgi(php-fpm)中,该参数不会起效。真正能够控制PHP脚本最大执行时:
valuename="request_terminate_timeout"0s/value
就是说如果是使用mod_php5.so的模式运行max_execution_time是会生效的,但是如果是php-fpm模式中运行时不生效的。
延伸阅读:
[ PHP ]
配置:php.ini
选项:
max_execution_time=30
或者在代码里设置:
ini_set("max_execution_time",30);
set_time_limit(30);
说明:
对当前会话生效,比如设置0一直不超时,但是如果php的safe_mode打开了,这些设置都会不生效。
效果一样,但是具体内容需要参考php-fpm部分内容,如果php-fpm中设置了request_terminate_timeout的话,那么max_execution_time就不生效。
【后端接口访问超时】
【HTTP访问】
一般我们访问HTTP方式很多,主要是:curl,socket,file_get_contents()等方法。
如果碰到对方服务器一直没有响应的时候,我们就悲剧了,很容易把整个服务器搞死,所以在访问http的时候也需要考虑超时的问题。
[ CURL 访问HTTP]
CURL 是我们常用的一种比较靠谱的访问HTTP协议接口的lib库,性能高,还有一些并发支持的功能等。
CURL:
curl_setopt($ch,opt)可以设置一些超时的设置,主要包括:
*(重要)CURLOPT_TIMEOUT设置cURL允许执行的最长秒数。
*(重要)CURLOPT_TIMEOUT_MS设置cURL允许执行的最长毫秒数。(在cURL7.16.2中被加入。从PHP5.2.3起可使用。)
CURLOPT_CONNECTTIMEOUT在发起连接前等待的时间,如果设置为0,则无限等待。
CURLOPT_CONNECTTIMEOUT_MS尝试连接等待的时间,以毫秒为单位。如果设置为0,则无限等待。在cURL7.16.2中被加入。从PHP5.2.3开始可用。
CURLOPT_DNS_CACHE_TIMEOUT设置在内存中保存DNS信息的时间,默认为120秒。
curl普通秒级超时:
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_TIMEOUT,60);//只需要设置一个秒的数量就可以
curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);
curl_setopt($ch,CURLOPT_USERAGENT,$defined_vars['HTTP_USER_AGENT']);
curl普通秒级超时使用:
curl_setopt($ch,CURLOPT_TIMEOUT,60);
curl如果需要进行毫秒超时,需要增加:
curl_easy_setopt(curl,CURLOPT_NOSIGNAL,1L);
或者是:
curl_setopt($ch,CURLOPT_NOSIGNAL,true);是可以支持毫秒级别超时设置的
curl一个毫秒级超时的例子:
复制代码 代码如下:
?php
if(!isset($_GET['foo'])){
//Client
$ch=curl_init('');
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_NOSIGNAL,1);//注意,毫秒超时一定要设置这个
curl_setopt($ch,CURLOPT_TIMEOUT_MS,200);//超时毫秒,cURL7.16.2中被加入。从PHP5.2.3起可使用
$data=curl_exec($ch);
$curl_errno=curl_errno($ch);
$curl_error=curl_error($ch);
curl_close($ch);
if($curl_errno0){
echo"cURLError($curl_errno):$curl_errorn";
}else{
echo"Datareceived:$datan";
}
}else{
//Server
sleep(10);
echo"Done.";
}
?
其他一些技巧:
1. 按照经验总结是:cURL版本=libcurl/7.21.0版本,毫秒级超时是一定生效的,切记。
2. curl_multi的毫秒级超时也有问题。。单次访问是支持ms级超时的,curl_multi并行调多个会不准
[流处理方式访问HTTP]
除了curl,我们还经常自己使用fsockopen、或者是file操作函数来进行HTTP协议的处理,所以,我们对这块的超时处理也是必须的。
一般连接超时可以直接设置,但是流读取超时需要单独处理。
自己写代码处理:
复制代码 代码如下:
$tmCurrent=gettimeofday();
$intUSGone=($tmCurrent['sec']-$tmStart['sec'])*1000000
+($tmCurrent['usec']-$tmStart['usec']);
if($intUSGone$this-_intReadTimeoutUS){
returnfalse;
}
或者使用内置流处理函数stream_set_timeout()和stream_get_meta_data()处理:
复制代码 代码如下:
?php
//Timeoutinseconds
$timeout=5;
$fp=fsockopen("",80,$errno,$errstr,$timeout);
if($fp){
fwrite($fp,"GET/HTTP/1.0rn");
fwrite($fp,"Host:rn");
fwrite($fp,"Connection:Closernrn");
stream_set_blocking($fp,true);//重要,设置为非阻塞模式
stream_set_timeout($fp,$timeout);//设置超时
$info=stream_get_meta_data($fp);
while((!feof($fp))(!$info['timed_out'])){
$data.=fgets($fp,4096);
$info=stream_get_meta_data($fp);
ob_flush;
flush();
}
if($info['timed_out']){
echo"ConnectionTimedOut!";
}else{
echo$data;
}
}
file_get_contents超时:
复制代码 代码如下:
?php
$timeout=array(
'http'=array(
'timeout'=5//设置一个超时时间,单位为秒
)
);
$ctx=stream_context_create($timeout);
$text=file_get_contents("",0,$ctx);
?
fopen超时:
复制代码 代码如下:
?php
$timeout=array(
'http'=array(
'timeout'=5//设置一个超时时间,单位为秒
)
);
$ctx=stream_context_create($timeout);
if($fp=fopen("","r",false,$ctx)){
while($c=fread($fp,8192)){
echo$c;
}
fclose($fp);
}
?
【MySQL】
php中的mysql客户端都没有设置超时的选项,mysqli和mysql都没有,但是libmysql是提供超时选项的,只是我们在php中隐藏了而已。
那么如何在PHP中使用这个操作捏,就需要我们自己定义一些MySQL操作常量,主要涉及的常量有:
MYSQL_OPT_READ_TIMEOUT=11;
MYSQL_OPT_WRITE_TIMEOUT=12;
这两个,定义以后,可以使用options设置相应的值。
不过有个注意点,mysql内部实现:
1.超时设置单位为秒,最少配置1秒
2.但mysql底层的read会重试两次,所以实际会是3秒
重试两次+ 自身一次=3倍超时时间,那么就是说最少超时时间是3秒,不会低于这个值,对于大部分应用来说可以接受,但是对于小部分应用需要优化。
查看一个设置访问mysql超时的php实例:
复制代码 代码如下:
?php
//自己定义读写超时常量
if(!defined('MYSQL_OPT_READ_TIMEOUT')){
define('MYSQL_OPT_READ_TIMEOUT',11);
}
if(!defined('MYSQL_OPT_WRITE_TIMEOUT')){
define('MYSQL_OPT_WRITE_TIMEOUT',12);
}
//设置超时
$mysqli=mysqli_init();
$mysqli-options(MYSQL_OPT_READ_TIMEOUT,3);
$mysqli-options(MYSQL_OPT_WRITE_TIMEOUT,1);
//连接数据库
$mysqli-real_connect("localhost","root","root","test");
if(mysqli_connect_errno()){
printf("Connectfailed:%s/n",mysqli_connect_error());
exit();
}
//执行查询sleep1秒不超时
printf("Hostinformation:%s/n",$mysqli-host_info);
if(!($res=$mysqli-query('selectsleep(1)'))){
echo"query1error:".$mysqli-error."/n";
}else{
echo"Query1:querysuccess/n";
}
//执行查询sleep9秒会超时
if(!($res=$mysqli-query('selectsleep(9)'))){
echo"query2error:".$mysqli-error."/n";
}else{
echo"Query2:querysuccess/n";
}
$mysqli-close();
echo"closemysqlconnection/n";
?
延伸阅读:
【Memcached】
[PHP扩展]
php_memcache客户端:
连接超时:boolMemcache::connect(string$host[,int$port[,int$timeout]])
在get和set的时候,都没有明确的超时设置参数。
libmemcached客户端:在php接口没有明显的超时参数。
说明:所以说,在PHP中访问Memcached是存在很多问题的,需要自己hack部分操作,或者是参考网上补丁。
[CC++访问Memcached]
客户端:libmemcached客户端
说明:memcache超时配置可以配置小点,比如5,10个毫秒已经够用了,超过这个时间还不如从数据库查询。
下面是一个连接和读取set数据的超时的C++示例:
复制代码 代码如下:
//创建连接超时(连接到Memcached)
memcached_st*MemCacheProxy::_create_handle()
{
memcached_st*mmc=NULL;
memcached_return_tprc;
if(_mpool!=NULL){//getfrompool
mmc=memcached_pool_pop(_mpool,false,prc);
if(mmc==NULL){
__LOG_WARNING__("MemCacheProxy","gethandlefrompoolerror[%d]",(int)prc);
}
returnmmc;
}
memcached_st*handle=memcached_create(NULL);
if(handle==NULL){
__LOG_WARNING__("MemCacheProxy","create_handleerror");
returnNULL;
}
//设置连接/读取超时
memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_HASH,MEMCACHED_HASH_DEFAULT);
memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_NO_BLOCK,_noblock);//参数MEMCACHED_BEHAVIOR_NO_BLOCK为1使超时配置生效,不设置超时会不生效,关键时候会悲剧的,容易引起雪崩
memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT,_connect_timeout);//连接超时
memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_RCV_TIMEOUT,_read_timeout);//读超时
memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_SND_TIMEOUT,_send_timeout);//写超时
memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_POLL_TIMEOUT,_poll_timeout);
//设置一致hash
//memcached_behavior_set_distribution(handle,MEMCACHED_DISTRIBUTION_CONSISTENT);
memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_DISTRIBUTION,MEMCACHED_DISTRIBUTION_CONSISTENT);
memcached_returnrc;
for(uinti=0;i_server_count;i++){
rc=memcached_server_add(handle,_ips[i],_ports[i]);
if(MEMCACHED_SUCCESS!=rc){
__LOG_WARNING__("MemCacheProxy","addserver[%s:%d]failed.",_ips[i],_ports[i]);
}
}
_mpool=memcached_pool_create(handle,_min_connect,_max_connect);
if(_mpool==NULL){
__LOG_WARNING__("MemCacheProxy","create_poolerror");
returnNULL;
}
mmc=memcached_pool_pop(_mpool,false,prc);
if(mmc==NULL){
__LOG_WARNING__("MyMemCacheProxy","gethandlefrompoolerror[%d]",(int)prc);
}
//__LOG_DEBUG__("MemCacheProxy","gethandle[%p]",handle);
returnmmc;
}
//设置一个key超时(set一个数据到memcached)
boolMemCacheProxy::_add(memcached_st*handle,unsignedint*key,constchar*value,intlen,unsignedinttimeout)
{
memcached_returnrc;
chartmp[1024];
snprintf(tmp,sizeof(tmp),"%u#%u",key[0],key[1]);
//有个timeout值
rc=memcached_set(handle,tmp,strlen(tmp),(char*)value,len,timeout,0);
if(MEMCACHED_SUCCESS!=rc){
returnfalse;
}
returntrue;
}
//Memcache读取数据超时(没有设置)
libmemcahed源码中接口定义:
LIBMEMCACHED_APIchar*memcached_get(memcached_st*ptr,constchar*key,size_tkey_length,size_t*value_length,uint32_t*flags,memcached_return_t*error);
LIBMEMCACHED_APImemcached_return_tmemcached_mget(memcached_st*ptr,constchar*const*keys,constsize_t*key_length,size_tnumber_of_keys);
从接口中可以看出在读取数据的时候,是没有超时设置的。
延伸阅读:
【如何实现超时】
程序中需要有超时这种功能,比如你单独访问一个后端Socket模块,Socket模块不属于我们上面描述的任何一种的时候,它的协议也是私有的,那么这个时候可能需要自己去实现一些超时处理策略,这个时候就需要一些处理代码了。
[PHP中超时实现]
一、初级:最简单的超时实现 (秒级超时)
思路很简单:链接一个后端,然后设置为非阻塞模式,如果没有连接上就一直循环,判断当前时间和超时时间之间的差异。
phpsocket中实现原始的超时:(每次循环都当前时间去减,性能会很差,cpu占用会较高)
复制代码 代码如下:
?
$host="127.0.0.1";
$port="80";
$timeout=15;//timeoutinseconds
$socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP)
ordie("Unabletocreatesocketn");
socket_set_nonblock($socket) //务必设置为阻塞模式
ordie("Unabletosetnonblockonsocketn");
$time=time();
//循环的时候每次都减去相应值
while(!@socket_connect($socket,$host,$port))//如果没有连接上就一直死循环
{
$err=socket_last_error($socket);
if($err==115||$err==114)
{
if((time()-$time)=$timeout)//每次都需要去判断一下是否超时了
{
socket_close($socket);
die("Connectiontimedout.n");
}
sleep(1);
continue;
}
die(socket_strerror($err)."n");
}
socket_set_block($this-socket)//还原阻塞模式
ordie("Unabletosetblockonsocketn");
?
二、升级:使用PHP自带异步IO去实现(毫秒级超时)
说明:
异步IO:异步IO的概念和同步IO相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。异步IO将比特分成小组进行传送,小组可以是8位的1个字符或更长。发送方可以在任何时刻发送这些比特组,而接收方从不知道它们会在什么时候到达。
多路复用:复用模型是对多个IO操作进行检测,返回可操作集合,这样就可以对其进行操作了。这样就避免了阻塞IO不能随时处理各个IO和非阻塞占用系统资源的确定。
使用socket_select()实现超时
socket_select(...,floor($timeout),ceil($timeout*1000000));
select的特点:能够设置到微秒级别的超时!
使用socket_select()的超时代码(需要了解一些异步IO编程的知识去理解)
复制代码 代码如下:
编程 调用类 编程#
?php
$server=newServer;
$client=newClient;
for(;;){
foreach($select-can_read(0)as$socket){
if($socket==$client-socket){
//NewClientSocket
$select-add(socket_accept($client-socket));
}
else{
//there'ssomethingtoreadon$socket
}
}
}
?
编程 异步多路复用IO 超时连接处理类 编程
?php
classselect{
var$sockets;
functionselect($sockets){
$this-sockets=array();
foreach($socketsas$socket){
$this-add($socket);
}
}
functionadd($add_socket){
array_push($this-sockets,$add_socket);
}
functionremove($remove_socket){
$sockets=array();
foreach($this-socketsas$socket){
if($remove_socket!=$socket)
$sockets[]=$socket;
}
$this-sockets=$sockets;
}
functioncan_read($timeout){
$read=$this-sockets;
socket_select($read,$write=NULL,$except=NULL,$timeout);
return$read;
}
functioncan_write($timeout){
$write=$this-sockets;
socket_select($read=NULL,$write,$except=NULL,$timeout);
return$write;
}
}
?
[CC++中超时实现]
一般在LinuxC/C++中,可以使用:alarm()设置定时器的方式实现秒级超时,或者:select()、poll()、epoll()之类的异步复用IO实现毫秒级超时。也可以使用二次封装的异步io库(libevent,libev)也能实现。
一、使用alarm中用信号实现超时 (秒级超时)
说明:Linux内核connect超时通常为75秒,我们可以设置更小的时间如10秒来提前从connect中返回。这里用使用信号处理机制,调用alarm,超时后产生SIGALRM信号(也可使用select实现)
用alarym秒级实现 connect设置超时代码示例:
复制代码 代码如下:
//信号处理函数
staticvoidconnect_alarm(intsigno)
{
debug_printf("SignalHandler");
return;
}
//alarm超时连接实现
staticvoidconn_alarm()
{
Sigfunc*sigfunc;//现有信号处理函数
sigfunc=signal(SIGALRM,connect_alarm);//建立信号处理函数connect_alarm,(如果有)保存现有的信号处理函数
inttimeout=5;
//设置闹钟
if(alarm(timeout)!=0){
//...闹钟已经设置处理
}
//进行连接操作
if(connect(m_Socket,(structsockaddr*)addr,sizeof(addr))0){
if(errno==EINTR){//如果错误号设置为EINTR,说明超时中断了
debug_printf("Timeout");
phplig的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于php里骨架屏调用、phplig的信息别忘了在本站进行查找喔。
