+ All Categories
Home > Internet > Interoperable PHP

Interoperable PHP

Date post: 15-Apr-2017
Category:
Upload: weltling
View: 568 times
Download: 2 times
Share this document with a friend
47
Interoperable PHP “We are only as strong as we are united, as weak as we are divided.” Dambledore Anatol Belski PHP Specialist September 2015
Transcript
Page 1: Interoperable PHP

Interoperable PHP“We are only as strong as we are united, as weak as we are divided.”

Dambledore

Anatol BelskiPHP SpecialistSeptember 2015

Page 2: Interoperable PHP

Interoperable PHP

Anatol Belski

@[email protected]

#php.pecl on efnet#winphp-dev on freenode

PHP 7.0 release managerPHP core developer

OSS guy

Page 3: Interoperable PHP

Interoperable PHP

OSTC• PHP• Hyper-V• Azure• Samba• Docker

Page 4: Interoperable PHP
Page 5: Interoperable PHP

Interoperable PHP

InteroperabilityHardware

Architecture

OS

Program

Page 6: Interoperable PHP

Interoperable PHP

A cross-platform program is …

- Hardware- OS- Architecture- …

independent and can run under various constellations.

Page 7: Interoperable PHP

Interoperable PHP

Topics• Filesystem• Time API• Performance• 32- vs 64-bit• Thread safety• Beyond

Page 8: Interoperable PHP

Interoperable PHP

Brief UNIX/Windows diff

UNIX/Linux• gcc• many libs• processes• C99• Ext*, reiserFS, HFS, etc.• UNIX permissions

Windows• vc++• core API + OSS libs• threads• C99 starting with VC12• NTFS, FAT• ACLs

Page 9: Interoperable PHP

Filesystem

Page 10: Interoperable PHP

Interoperable PHP

File permissions

UNIX/Linux• chmod +x file• chmod -r file• chmod ugo-r file• chmod +r file• no equivalent• no equivalent• chmod +t somedir

Windows• no equivalent• icacls file /deny nick:(R)• no equivalent• icacls file /grant nick:(R)• icacls file /grant nick:(GR,GW)• icacls file /inheritance:e• no equivalent

Page 11: Interoperable PHP

Interoperable PHP

File/process permissions• UNIX/Linux• chmod(), chown(), etc.• process permissions are handled same way as file ones

• Windows• icacls• impersonation• Unmapped UNIX users built-in SID mapping

Page 12: Interoperable PHP

Interoperable PHP

Access time

• ext3, ext4 and others• noatime,nodiratime in /etc/fstab

• NTFS• fsutil behavior query DisableLastAccess• fsutil behavior set DisebleLastAccess 0

Page 13: Interoperable PHP

Interoperable PHP

NTFS streamsC:\tmp> echo hello > foo.txt

C:\tmp>echo world > foo.txt:bar.txt

C:\tmp>dir /r foo.txt

Volume in drive C is SYSTEM

Volume Serial Number is AE0A-76BD

Directory of C:\tmp

08/31/2015 11:50 PM 8 foo.txt

8 foo.txt:bar.txt:$DATA

1 File(s) 8 bytes

0 Dir(s) 59,944,050,688 bytes free

Page 14: Interoperable PHP

Interoperable PHP

PHP FS snippet 1<?php

var_dump(file_exists("/"));

// Windowsbool(true)

//Linuxbool(true)

Page 15: Interoperable PHP

Interoperable PHP

PHP FS snippet 2

<?php

var_dump(dirname('/windows/system', 2));

// Windowsstring(1) "\“

//Linuxstring(1) “/"

Page 16: Interoperable PHP

Interoperable PHP

PHP FS snippet 3<?php

$f = fopen("file.txt", "w");var_dump(unlink("file.txt"));

// Windows

Warning: unlink(file.txt): Permission denied in Command line code on line 1

bool(false)

//Linux

bool(true)

Page 17: Interoperable PHP

Interoperable PHP

PHP FS snippet 4<?php

var_dump(fopen("some/directory", "r"));

// Windows

Warning: fopen(some/directory): failed to open stream: Permission denied in Command line code on line 1

bool(false)

//Linux

resource(5) of type (stream)

Page 18: Interoperable PHP

Interoperable PHP

Some PHP FS functions• readdir()• glob()• symlink()• relapath()• temp dir• PHP extension paths

Page 19: Interoperable PHP

Time APIs

Page 20: Interoperable PHP

Interoperable PHP

System time APIs• TSC• RDTSC• RDTSCP

• PM clock• HPET timer• POSIX clock• WIN8+

Page 21: Interoperable PHP

Interoperable PHP

gettimeofday()• UNIX/Linux• us resolution + dependency on userspace tools

• Windows• Win8+ with resolution <1us

Page 22: Interoperable PHP

Interoperable PHP

Time examples in PHP• microtime() != microtime()• uniqid() is based on microtime()• usleep()• timeout handling

Page 23: Interoperable PHP

PHP Performance

Page 24: Interoperable PHP

Interoperable PHP

PHP opcode caches• Opcache• WinCache• APC• APCu

Page 25: Interoperable PHP

Interoperable PHP

Performance PHP way• QB extension• Zephir• Recki-ct• Memcache, etc.• Write good PHP

Page 26: Interoperable PHP

Interoperable PHP

Performance compiler way• PGO (VC++)• LTO/FDO (gcc)• Assembler• Compiler intrinsics

Page 27: Interoperable PHP

Interoperable PHP

PGO

Instrument

• Produce an instrumented build

Train

• Run training scenarios

Optimize

• Produce optimized build using the training data

Page 28: Interoperable PHP

64-bit

Page 29: Interoperable PHP

Interoperable PHP

Do you think this works?

$x = str_repeat("x", PHP_INT_MAX);

Page 30: Interoperable PHP

Interoperable PHP

64- vs 32-bit in PHP

64-bit• In general slower• 9.22337204 × 109 GB

RAM addressable• 64-bit integers• LFS• 64-bit string length

32-bit• In general faster• Less than 2 GB RAM

addressable• 32-bit integers• 32-bit file operations• 32-bit string length

Page 31: Interoperable PHP

Interoperable PHP

Types in PHP7• zend_long for integers• zend_ulong for numeric hashes• size_t for string length• zend_off_t for file offsets• zend_stat_t for file offsets

Page 32: Interoperable PHP

Treads vs. Processes

Page 33: Interoperable PHP

Interoperable PHP

Threads

Thread #3

Thread #1

Page 34: Interoperable PHP

Interoperable PHP

Process/ThreadProcess single

threaded

stack

text

data

heap

Process multi threaded

stack

stack

text

data

heap

Thread 1

Thread 2

Page 35: Interoperable PHP

Interoperable PHP

Treads vs processes• Thread locking• Shared memory• security• performance

Page 36: Interoperable PHP

Interoperable PHP

PHP SAPIs• Apache (worker, prefork, winnt)• CGI/FastCGI/FPM (NGINX, IIS, Apache, etc.)• Embed• Many unsupported SAPIs removed in PHP7

Page 37: Interoperable PHP

Interoperable PHP

Apache mpm_prefork

Master

Child 1

Child 2

Child n

Page 38: Interoperable PHP

Interoperable PHP

Apache mpm_worker

Master

Child 1

Child 2

Child n

\\\\\\\\\\\v

Thread 1

Thread 2

Thread n

\\\\\\\\\\\v

\\\\\\\\\\\v

Thread 1

Thread 2

Thread n

\\\\\\\\\\\v

\\\\\\\\\\\v

\\\\\\\\\\\v

Thread 1

Thread 2

Thread n

\\\\\\\\\\\v

\\\\\\\\\\\v

\\\\\\\\\\\v

\\\\\\\\\\\v

Page 39: Interoperable PHP

Interoperable PHP

TLS● __thread qualifier is not a standard● __declspec(thread) is not a standard● thread_local is C++11 standard

Page 40: Interoperable PHP

Thread 1

Thread 2

static __thread int i = 0; static int j = 0; void start_thread(void *dummy) { char hello[6]; char *world; memcpy(hello, "hello", 5); world = malloc(sizeof(char) * 5); memcpy(world, "world", 5); i++; } int main(int argc, char **argv) { pthread_t t0, t1; rc = pthread_create(&t0, NULL, start_thread, NULL); rc = pthread_create(&t1, NULL, start_thread, NULL); return 0; }

Page 41: Interoperable PHP

Interoperable PHP

TLS in PHP7TSRM/TSRM.h

#ifdef TSRM_WIN32# define TSRM_TLS __declspec(thread)#else# define TSRM_TLS __thread#endif

Zend/zend_types.h

#ifdef ZTS#define ZEND_TLS static TSRM_TLS#define ZEND_EXT_TLS TSRM_TLS#else#define ZEND_TLS static#define ZEND_EXT_TLS#endif

Page 42: Interoperable PHP

Interoperable PHP

TS or NTS with PHP?

TS• Less RAM consuming• Faster startup• Less library

compatibility• More complexity• Slower processing

NTS• More RAM consuming• Slower startup• More library

compatibility• Less complexity• Faster processing

Page 43: Interoperable PHP

Interoperable PHP

Some PHP core functions• mt_rand()• fork()• chroot()• setlocale()/localeconv()• symlink()/link()• fputcsv()• mail()• getenv()/putenv()

Page 44: Interoperable PHP

Interoperable PHP

C APIs implementations in PHP

snprintf sprintf spprintf strlcat strlcpy glob sscanf strnatcmp strtod gettimeofday usleep nanosleep select opendir readdir rewinddir flock socketpair syslog openlog closelog ...

Page 45: Interoperable PHP

Questions?

Page 46: Interoperable PHP

Thanks for your attention!

Page 47: Interoperable PHP

Interoperable PHP

Links• https://msdn.microsoft.com/en-us/library/e7k32f4k.aspx

• http://blogs.msdn.com/b/vcblog/archive/2013/05/06/speeding-up-php-performance-for-your-application-using-profile-guided-optimization-pgo.aspx

• https://msdn.microsoft.com/en-us/library/windows/desktop/aa364404%28v=vs.85%29.aspx

• https://wiki.php.net/rfc/removal_of_dead_sapis

• https://wiki.php.net/rfc/remove_deprecated_functionality_in_php7

• https://wiki.php.net/rfc/native-tls

• https://wiki.php.net/rfc/size_t_and_int64_next


Recommended