diff --git a/lang/php5/Makefile b/lang/php5/Makefile index dac3c738e..3ab2e8eae 100644 --- a/lang/php5/Makefile +++ b/lang/php5/Makefile @@ -8,17 +8,17 @@ include $(TOPDIR)/rules.mk PKG_NAME:=php -PKG_VERSION:=5.6.8 +PKG_VERSION:=5.6.16 PKG_RELEASE:=1 -PKG_MAINTAINER:=W. Michael Petullo +PKG_MAINTAINER:=W. Michael Petullo , Michael Heimpold PKG_LICENSE:=PHPv3.01 PKG_LICENSE_FILES:=LICENSE -PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=http://www.php.net/distributions/ -PKG_MD5SUM:=a5a6df33aade0cb5425e4374e3832f0b +PKG_MD5SUM:=3f1d999ed1f9cb5713c9a0161c557f2f PKG_FIXUP:=libtool autoreconf PKG_BUILD_PARALLEL:=1 @@ -36,7 +36,7 @@ PHP5_MODULES = \ json \ ldap \ mbstring mcrypt mysql mysqli \ - openssl \ + opcache openssl \ pcntl pdo pdo-mysql pdo-pgsql pdo-sqlite pgsql \ session shmop simplexml soap sockets sqlite3 sysvmsg sysvsem sysvshm \ tokenizer \ @@ -55,7 +55,6 @@ define Package/php5/Default CATEGORY:=Languages TITLE:=PHP5 Hypertext preprocessor URL:=http://www.php.net/ - MAINTAINER:=Michael Heimpold DEPENDS:=php5 endef @@ -276,6 +275,12 @@ else CONFIGURE_ARGS+= --without-mysqli endif +ifneq ($(SDK)$(CONFIG_PACKAGE_php5-mod-opcache),) + CONFIGURE_ARGS+= --enable-opcache=shared +else + CONFIGURE_ARGS+= --disable-opcache +endif + ifneq ($(SDK)$(CONFIG_PACKAGE_php5-mod-openssl),) CONFIGURE_ARGS+= \ --with-openssl=shared,"$(STAGING_DIR)/usr" \ @@ -508,7 +513,11 @@ define BuildModule $(INSTALL_DIR) $$(1)/usr/lib/php $(INSTALL_BIN) $(PKG_BUILD_DIR)/modules/$(subst -,_,$(1)).so $$(1)/usr/lib/php/ $(INSTALL_DIR) $$(1)/etc/php5 + ifeq ($(4),zend) + echo "zend_extension=/usr/lib/php/$(subst -,_,$(1)).so" > $$(1)/etc/php5/$(subst -,_,$(1)).ini + else echo "extension=$(subst -,_,$(1)).so" > $$(1)/etc/php5/$(subst -,_,$(1)).ini + endif endef $$(eval $$(call BuildPackage,php5-mod-$(1))) @@ -540,6 +549,7 @@ $(eval $(call BuildModule,mbstring,MBString)) $(eval $(call BuildModule,mcrypt,Mcrypt,+PACKAGE_php5-mod-mcrypt:libmcrypt +PACKAGE_php5-mod-mcrypt:libltdl)) $(eval $(call BuildModule,mysql,MySQL,+PACKAGE_php5-mod-mysql:libmysqlclient)) $(eval $(call BuildModule,mysqli,MySQL Improved Extension,+PACKAGE_php5-mod-mysqli:libmysqlclient)) +$(eval $(call BuildModule,opcache,OPcache,,zend)) $(eval $(call BuildModule,openssl,OpenSSL,+PACKAGE_php5-mod-openssl:libopenssl)) $(eval $(call BuildModule,pcntl,PCNTL)) $(eval $(call BuildModule,pdo,PHP Data Objects)) diff --git a/lang/php5/files/php.ini b/lang/php5/files/php.ini index 6fe2a3108..23a8bb988 100644 --- a/lang/php5/files/php.ini +++ b/lang/php5/files/php.ini @@ -309,3 +309,13 @@ ldap.max_links = -1 [mcrypt] ;mcrypt.algorithms_dir= ;mcrypt.modes_dir= + +[opcache] +;opcache.memory_consumption=8 ; 8M is the allowed minimum +;opcache.interned_strings_buffer=1 +opcache.max_accelerated_files=200 ; 200 is the allowed minimum +;opcache.revalidate_freq=60 +;opcache.fast_shutdown=1 +opcache.enable_cli=1 +opcache.enable=1 +;opcache.log_verbosity_level=4 diff --git a/lang/php5/patches/102-debian_patches_use_embedded_timezonedb.patch b/lang/php5/patches/102-debian_patches_use_embedded_timezonedb.patch index 438274aa1..bfbed435c 100644 --- a/lang/php5/patches/102-debian_patches_use_embedded_timezonedb.patch +++ b/lang/php5/patches/102-debian_patches_use_embedded_timezonedb.patch @@ -1,12 +1,13 @@ - Add support for use of the system timezone database, rather than embedding a copy. Discussed upstream but was not desired. History: -r9: fix another compile error without --with-system-tzdata configured +r11: adopted to php 5.6.9 +r10: make timezone case insensitive +r9: fix another compile error without --with-system-tzdata configured (Michael Heimpold) r8: fix compile error without --with-system-tzdata configured r7: improve check for valid timezone id to exclude directories -r6: fix fd leak in r5, fix country code/BC flag use in +r6: fix fd leak in r5, fix country code/BC flag use in. timezone_identifiers_list() using system db, fix use of PECL timezonedb to override system db, r5: reverts addition of "System/Localtime" fake tzname. @@ -19,8 +20,14 @@ r1: initial revision --- a/ext/date/lib/parse_tz.c +++ b/ext/date/lib/parse_tz.c -@@ -20,6 +20,16 @@ +@@ -18,8 +18,22 @@ + /* $Id$ */ + ++#ifndef PATH_MAX ++#define PATH_MAX 4096 ++#endif ++ #include "timelib.h" +#ifdef HAVE_SYSTEM_TZDATA @@ -36,12 +43,12 @@ r1: initial revision #include #ifdef HAVE_LOCALE_H -@@ -31,7 +41,12 @@ - #else +@@ -32,8 +46,12 @@ #include #endif -+ + +#ifndef HAVE_SYSTEM_TZDATA + #define TIMELIB_SUPPORTS_V2DATA #include "timezonedb.h" +#endif + @@ -49,25 +56,19 @@ r1: initial revision #if (defined(__APPLE__) || defined(__APPLE_CC__)) && (defined(__BIG_ENDIAN__) || defined(__LITTLE_ENDIAN__)) # if defined(__LITTLE_ENDIAN__) -@@ -51,9 +66,14 @@ - - static void read_preamble(const unsigned char **tzf, timelib_tzinfo *tz) +@@ -55,6 +73,11 @@ static int read_preamble(const unsigned { -- /* skip ID */ -- *tzf += 4; -- -+ if (memcmp(tzf, "TZif", 4) == 0) { -+ *tzf += 20; -+ return; -+ } -+ -+ /* skip ID */ -+ *tzf += 4; -+ - /* read BC flag */ - tz->bc = (**tzf == '\1'); - *tzf += 1; -@@ -256,7 +276,397 @@ void timelib_dump_tzinfo(timelib_tzinfo + uint32_t version; + ++ if (memcmp(tzf, "TZif", 4) == 0) { ++ *tzf += 20; ++ return -1; ++ } ++ + /* read ID */ + version = (*tzf)[3] - '0'; + *tzf += 4; +@@ -298,7 +321,406 @@ void timelib_dump_tzinfo(timelib_tzinfo } } @@ -81,7 +82,7 @@ r1: initial revision +#endif + +/* System timezone database pointer. */ -+static const timelib_tzdb *timezonedb_system = NULL; ++static const timelib_tzdb *timezonedb_system; + +/* Hash table entry for the cache of the zone.tab mapping table. */ +struct location_info { @@ -99,13 +100,14 @@ r1: initial revision + * prevent too many collisions. */ +#define LOCINFO_HASH_SIZE (1021) + ++/* Compute a case insensitive hash of str */ +static uint32_t tz_hash(const char *str) +{ + const unsigned char *p = (const unsigned char *)str; + uint32_t hash = 5381; + int c; + -+ while ((c = *p++) != '\0') { ++ while ((c = tolower(*p++)) != '\0') { + hash = (hash << 5) ^ hash ^ c; + } + @@ -201,10 +203,10 @@ r1: initial revision + + if (*p == '#' || *p == '\0' || *p == '\n') + continue; -+ ++ + if (!isalpha(p[0]) || !isalpha(p[1]) || p[2] != '\t') + continue; -+ ++ + /* code => AA */ + code = p; + p[2] = 0; @@ -238,7 +240,7 @@ r1: initial revision + + if (*p == '\n' || *p == '\t') + *p = '\0'; -+ ++ + hash = tz_hash(name); + i = malloc(sizeof *i); + memcpy(i->code, code, 2); @@ -274,7 +276,7 @@ r1: initial revision + } + + return NULL; -+} ++} + +/* Filter out some non-tzdata files and the posix/right databases, if + * present. */ @@ -443,6 +445,14 @@ r1: initial revision + return NULL; + } + ++ if (system_location_table) { ++ const struct location_info *li; ++ if ((li = find_zone_info(system_location_table, timezone)) != NULL) { ++ /* Use the stored name to avoid case issue */ ++ timezone = li->name; ++ } ++ } ++ + snprintf(fname, sizeof fname, ZONEINFO_PREFIX "/%s", timezone); + + fd = open(fname, O_RDONLY); @@ -466,11 +476,11 @@ r1: initial revision { int left = 0, right = tzdb->index_size - 1; #ifdef HAVE_SETLOCALE -@@ -295,36 +705,128 @@ static int seek_to_tz_position(const uns +@@ -337,21 +759,90 @@ static int seek_to_tz_position(const uns return 0; } -+static int seek_to_tz_position(const unsigned char **tzf, char *timezone, ++static int seek_to_tz_position(const unsigned char **tzf, char *timezone, + char **map, size_t *maplen, + const timelib_tzdb *tzdb) +{ @@ -483,14 +493,14 @@ r1: initial revision + return 0; + } + -+ (*tzf) = (unsigned char *)orig ; ++ (*tzf) = (unsigned char *)orig; + *map = orig; -+ -+ return 1; ++ ++ return 1; + } -+ else ++ else +#endif -+ { ++ { + return inmem_seek_to_tz_position(tzf, timezone, tzdb); + } +} @@ -505,7 +515,7 @@ r1: initial revision + tmp->data = NULL; + create_zone_index(tmp); + system_location_table = create_location_table(); -+ fake_data_segment(tmp, system_location_table); ++ fake_data_segment(tmp, system_location_table); + timezonedb_system = tmp; + } + @@ -533,38 +543,49 @@ r1: initial revision - return (seek_to_tz_position(&tzf, timezone, tzdb)); + +#ifdef HAVE_SYSTEM_TZDATA -+ if (tzdb == timezonedb_system) { -+ char fname[PATH_MAX]; -+ struct stat st; ++ if (tzdb == timezonedb_system) { ++ char fname[PATH_MAX]; ++ struct stat st; + -+ if (timezone[0] == '\0' || strstr(timezone, "..") != NULL) { -+ return 0; -+ } -+ -+ snprintf(fname, sizeof fname, ZONEINFO_PREFIX "/%s", timezone); -+ -+ return stat(fname, &st) == 0 && is_valid_tzfile(&st); -+ } ++ if (timezone[0] == '\0' || strstr(timezone, "..") != NULL) { ++ return 0; ++ } ++ ++ if (system_location_table) { ++ if (find_zone_info(system_location_table, timezone) != NULL) { ++ /* found in cache */ ++ return 1; ++ } ++ } ++ ++ snprintf(fname, sizeof fname, ZONEINFO_PREFIX "/%s", timezone); ++ ++ return stat(fname, &st) == 0 && is_valid_tzfile(&st); ++ } +#endif + + return (inmem_seek_to_tz_position(&tzf, timezone, tzdb)); } + static void skip_64bit_preamble(const unsigned char **tzf, timelib_tzinfo *tz) +@@ -376,10 +867,12 @@ static void read_64bit_header(const unsi timelib_tzinfo *timelib_parse_tzfile(char *timezone, const timelib_tzdb *tzdb) { const unsigned char *tzf; + char *memmap = NULL; + size_t maplen; timelib_tzinfo *tmp; + int version; - if (seek_to_tz_position(&tzf, timezone, tzdb)) { + if (seek_to_tz_position(&tzf, timezone, &memmap, &maplen, tzdb)) { tmp = timelib_tzinfo_ctor(timezone); - read_preamble(&tzf, tmp); - read_header(&tzf, tmp); - read_transistions(&tzf, tmp); - read_types(&tzf, tmp); + version = read_preamble(&tzf, tmp); +@@ -393,7 +886,34 @@ timelib_tzinfo *timelib_parse_tzfile(cha + skip_64bit_types(&tzf, tmp); + skip_posix_string(&tzf, tmp); + } - read_location(&tzf, tmp); + +#ifdef HAVE_SYSTEM_TZDATA @@ -576,12 +597,11 @@ r1: initial revision + + if ((li = find_zone_info(system_location_table, timezone)) != NULL) { + tmp->location.comments = strdup(li->comment); -+ strncpy(tmp->location.country_code, li->code, 2); ++ strncpy(tmp->location.country_code, li->code, 2); + tmp->location.longitude = li->longitude; + tmp->location.latitude = li->latitude; + tmp->bc = 1; -+ } -+ else { ++ } else { + strcpy(tmp->location.country_code, "??"); + tmp->bc = 0; + tmp->location.comments = strdup(""); diff --git a/lang/php5/patches/200-ext-opcache-fix-detection-of-shm-mmap.patch b/lang/php5/patches/200-ext-opcache-fix-detection-of-shm-mmap.patch new file mode 100644 index 000000000..d2a1e91af --- /dev/null +++ b/lang/php5/patches/200-ext-opcache-fix-detection-of-shm-mmap.patch @@ -0,0 +1,159 @@ +From dc8bb6a53bfdfe42d9ae81d4e78c6155ad4bfd6e Mon Sep 17 00:00:00 2001 +From: Michael Heimpold +Date: Sun, 17 May 2015 16:50:50 +0200 +Subject: [PATCH] ext/opcache: fix detection of shm/mmap + +The detection of sysvipc and mmap doesn't work well when cross-compiling, +so I decided to only check for the availability of the functions involved. +This is not a clean solution, but works for now(tm) :-) + +It should be discussed with upstream to find a better solution. + +This solves the issue reported at +https://github.com/openwrt/packages/issues/1010 +and makes opcache usable on OpenWrt. + +Signed-off-by: Michael Heimpold +--- + ext/opcache/config.m4 | 122 ++----------------------------------------------- + 1 file changed, 4 insertions(+), 118 deletions(-) + +diff --git a/ext/opcache/config.m4 b/ext/opcache/config.m4 +index b7e4835..7b6c0aa 100644 +--- a/ext/opcache/config.m4 ++++ b/ext/opcache/config.m4 +@@ -11,127 +11,13 @@ if test "$PHP_OPCACHE" != "no"; then + AC_DEFINE(HAVE_MPROTECT, 1, [Define if you have mprotect() function]) + ]) + +- AC_MSG_CHECKING(for sysvipc shared memory support) +- AC_TRY_RUN([ +-#include +-#include +-#include +-#include +-#include +-#include +- +-int main() { +- pid_t pid; +- int status; +- int ipc_id; +- char *shm; +- struct shmid_ds shmbuf; +- +- ipc_id = shmget(IPC_PRIVATE, 4096, (IPC_CREAT | SHM_R | SHM_W)); +- if (ipc_id == -1) { +- return 1; +- } +- +- shm = shmat(ipc_id, NULL, 0); +- if (shm == (void *)-1) { +- shmctl(ipc_id, IPC_RMID, NULL); +- return 2; +- } +- +- if (shmctl(ipc_id, IPC_STAT, &shmbuf) != 0) { +- shmdt(shm); +- shmctl(ipc_id, IPC_RMID, NULL); +- return 3; +- } +- +- shmbuf.shm_perm.uid = getuid(); +- shmbuf.shm_perm.gid = getgid(); +- shmbuf.shm_perm.mode = 0600; +- +- if (shmctl(ipc_id, IPC_SET, &shmbuf) != 0) { +- shmdt(shm); +- shmctl(ipc_id, IPC_RMID, NULL); +- return 4; +- } +- +- shmctl(ipc_id, IPC_RMID, NULL); +- +- strcpy(shm, "hello"); +- +- pid = fork(); +- if (pid < 0) { +- return 5; +- } else if (pid == 0) { +- strcpy(shm, "bye"); +- return 6; +- } +- if (wait(&status) != pid) { +- return 7; +- } +- if (!WIFEXITED(status) || WEXITSTATUS(status) != 6) { +- return 8; +- } +- if (strcmp(shm, "bye") != 0) { +- return 9; +- } +- return 0; +-} +-],dnl ++ AC_CHECK_FUNC(shmget,[ + AC_DEFINE(HAVE_SHM_IPC, 1, [Define if you have SysV IPC SHM support]) +- msg=yes,msg=no,msg=no) +- AC_MSG_RESULT([$msg]) +- +- AC_MSG_CHECKING(for mmap() using MAP_ANON shared memory support) +- AC_TRY_RUN([ +-#include +-#include +-#include +-#include +-#include +- +-#ifndef MAP_ANON +-# ifdef MAP_ANONYMOUS +-# define MAP_ANON MAP_ANONYMOUS +-# endif +-#endif +-#ifndef MAP_FAILED +-# define MAP_FAILED ((void*)-1) +-#endif +- +-int main() { +- pid_t pid; +- int status; +- char *shm; +- +- shm = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0); +- if (shm == MAP_FAILED) { +- return 1; +- } +- +- strcpy(shm, "hello"); ++ ]) + +- pid = fork(); +- if (pid < 0) { +- return 5; +- } else if (pid == 0) { +- strcpy(shm, "bye"); +- return 6; +- } +- if (wait(&status) != pid) { +- return 7; +- } +- if (!WIFEXITED(status) || WEXITSTATUS(status) != 6) { +- return 8; +- } +- if (strcmp(shm, "bye") != 0) { +- return 9; +- } +- return 0; +-} +-],dnl ++ AC_CHECK_FUNC(mmap,[ + AC_DEFINE(HAVE_SHM_MMAP_ANON, 1, [Define if you have mmap(MAP_ANON) SHM support]) +- msg=yes,msg=no,msg=no) +- AC_MSG_RESULT([$msg]) ++ ]) + + AC_MSG_CHECKING(for mmap() using /dev/zero shared memory support) + AC_TRY_RUN([ +-- +1.7.10.4 + diff --git a/lang/php5/patches/950-Fix-dl-cross-compiling-issue.patch b/lang/php5/patches/950-Fix-dl-cross-compiling-issue.patch index 02b1f644c..22122ec82 100644 --- a/lang/php5/patches/950-Fix-dl-cross-compiling-issue.patch +++ b/lang/php5/patches/950-Fix-dl-cross-compiling-issue.patch @@ -1,7 +1,6 @@ -diff -u --recursive php-5.6.6-vanilla/configure.in php-5.6.6/configure.in ---- php-5.6.6-vanilla/configure.in 2015-02-26 22:10:51.865487530 -0500 -+++ php-5.6.6/configure.in 2015-02-26 22:29:59.043102135 -0500 -@@ -453,7 +453,10 @@ +--- a/configure.in ++++ b/configure.in +@@ -453,7 +453,10 @@ PHP_CHECK_FUNC(gethostname, nsl) PHP_CHECK_FUNC(gethostbyaddr, nsl) PHP_CHECK_FUNC(yp_get_default_domain, nsl) @@ -13,10 +12,9 @@ diff -u --recursive php-5.6.6-vanilla/configure.in php-5.6.6/configure.in if test "$ac_cv_func_dlopen" = "yes"; then AC_DEFINE(HAVE_LIBDL, 1, [ ]) fi -diff -u --recursive php-5.6.6-vanilla/ext/fileinfo/config.m4 php-5.6.6/ext/fileinfo/config.m4 ---- php-5.6.6-vanilla/ext/fileinfo/config.m4 2015-02-26 22:10:51.639487135 -0500 -+++ php-5.6.6/ext/fileinfo/config.m4 2015-02-26 22:22:47.645609128 -0500 -@@ -46,6 +46,10 @@ +--- a/ext/fileinfo/config.m4 ++++ b/ext/fileinfo/config.m4 +@@ -46,6 +46,10 @@ int main(void) AC_MSG_RESULT(no) AC_MSG_NOTICE(using libmagic strcasestr implementation) libmagic_sources="$libmagic_sources libmagic/strcasestr.c" @@ -27,10 +25,9 @@ diff -u --recursive php-5.6.6-vanilla/ext/fileinfo/config.m4 php-5.6.6/ext/filei ]) PHP_NEW_EXTENSION(fileinfo, fileinfo.c $libmagic_sources, $ext_shared,,-I@ext_srcdir@/libmagic) -diff -u --recursive php-5.6.6-vanilla/ext/opcache/config.m4 php-5.6.6/ext/opcache/config.m4 ---- php-5.6.6-vanilla/ext/opcache/config.m4 2015-02-26 22:10:51.790487399 -0500 -+++ php-5.6.6/ext/opcache/config.m4 2015-02-26 22:34:19.240414394 -0500 -@@ -341,7 +341,14 @@ +--- a/ext/opcache/config.m4 ++++ b/ext/opcache/config.m4 +@@ -227,7 +227,14 @@ AC_TRY_RUN([ flock_type=linux AC_DEFINE([HAVE_FLOCK_LINUX], [], [Struct flock is Linux-type]) AC_MSG_RESULT("yes") @@ -46,7 +43,7 @@ diff -u --recursive php-5.6.6-vanilla/ext/opcache/config.m4 php-5.6.6/ext/opcach AC_MSG_CHECKING("whether flock struct is BSD ordered") AC_TRY_RUN([ -@@ -357,7 +364,12 @@ +@@ -243,7 +250,12 @@ AC_TRY_RUN([ flock_type=bsd AC_DEFINE([HAVE_FLOCK_BSD], [], [Struct flock is BSD-type]) AC_MSG_RESULT("yes") diff --git a/lang/php5/pecl.mk b/lang/php5/pecl.mk index e1b981963..ee2a5ce77 100644 --- a/lang/php5/pecl.mk +++ b/lang/php5/pecl.mk @@ -1,5 +1,5 @@ # -# Copyright (C) 2011-2014 OpenWrt.org +# Copyright (C) 2011-2015 OpenWrt.org # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. @@ -10,13 +10,12 @@ define Package/php5-pecl/Default SECTION:=lang CATEGORY:=Languages URL:=http://pecl.php.net/ - MAINTAINER:=Michael Heimpold DEPENDS:=php5 endef -define Build/Configure +define Build/Prepare + $(Build/Prepare/Default) ( cd $(PKG_BUILD_DIR); $(STAGING_DIR_HOST)/usr/bin/phpize ) - $(Build/Configure/Default) endef CONFIGURE_ARGS+= \