Ok, thanks for the clarification :-)

I guess an opcode cache server of some sort would be the only way to do
this, listening either on a Unix socket og a TCP/IP socket.  Probably not
worth it anyway.

I'm going to leave the list again as I just wanted to share my "brilliant"
idea with you guys :-)

Cheers,
Mikael

man. 2. maj 2016 kl. 11.45 skrev Joe Watkins <pthre...@pthreads.org>:

> Morning Mikeal,
>
>    The memory that opcache uses is anonymously mapped shared memory, this
> cannot be shared across distinct processes, it is not backed by any file.
>
>    Even if you were to back the memory with a file, the most efficient
> synchronization primitives that exists cannot be shared across distinct
> processes either.
>
>    This is why opcache, apc(u) etc only work as expected in a prefork
> multi processing model.
>
> Cheers
> Joe
>
> On Sun, May 1, 2016 at 11:12 PM, Mikael Lyngvig <mik...@lyngvig.org>
> wrote:
>
>> Hi guys,
>>
>> I am working on and off on my own programming language, but knowing myself
>> well, I know that this is just a hobby project that will never be
>> finished.
>>
>> I have an idea for PHP7 that may or may not be relevant to you guys.  I do
>> code in C but I don't have the time to get deeply involved in PHP.
>> Therefore I will present my idea.  I hope that your reply will be "Oh,
>> PHP(x) already does this!" or "Great, that sounds useful to us!" :-)
>>
>> The idea is especially relevant to large web hosting companies that run
>> tens of thousands of PHP-powered websites.  It has only little relevance
>> to
>> a small VPS running few pages.
>>
>> The basic idea is as follows:
>>
>> Try to reduce the global memory load on the PHP opcode cache and the
>> server
>> by sharing cached module's opcodes across totally independent sites on the
>> server.
>>
>> I know this has to be done very carefully, otherwise all hell will break
>> lose :-)
>>
>> My take on this idea is this:
>>
>> 1. Compute an SHA512 checksum for all source files that are entered into
>> the opcode cache.
>> 2. If the SHA512 checksum is identical to an existing checksum, the files
>> are considered identical and can share entries in the opcode cache (which
>> needs a reference count or something).
>> 3. To reduce the overhead of computing the SHA512 checksum, the SHA512
>> checksums are cached in another cache.
>> 4. This makes for two caches: the checksum cache and the opcode cache
>> (called "the module cache" below).
>>
>> The first cache, the checksum cache, is updated whenever a new PHP source
>> file needs to be cached.
>> The second cache, the opcode cache, is ONLY updated if the checksum is not
>> already in the checksum cache.
>>
>> The idea here is that PHPx can cache opcodes from, say, 200 different
>> WordPress installations (of the exact same version, although this happens
>> automatically) as ONE opcode cache entry.  This should really be a nice
>> gift to all the great web hosting companies out there that offer PHPx as
>> part of their service. Suddenly their machines may have 200-1000 times "as
>> much" opcode memory as before.
>>
>> I hope this makes you happier not unhappier!  If my idea is crazy or
>> cannot
>> be done for reasons I don't see, please let me know.  I just think it is a
>> cool idea and it is a shame that it lies unused on my harddisk when you
>> might as well make use of it.  I use PHP daily and I so much look forward
>> to my web hosting company upgrading to PHP7 because of the default
>> exception error reporting and the enhanced opcode cache.
>>
>> P.S. The sample code is written in my own language, but should be readable
>> to virtually anybody.
>>
>> Cheers,
>> Archfrog
>>
>> My private notes (in case they help somebody understand what I mean) are:
>>
>> A source file contains a single module, which may contain definitions
>> for any number of symbols.  The source file is cached using
>> its SHA-512 value so that multiple identical source files in the
>> system are treated as one.  This saves a lot of space in shared
>> hosting environments where the same source files (WordPress, etc.) are
>> located in thousands of locations on the disk.  Instead of
>> keeping thousands of redundant copies in memory, this system only
>> keeps a single copy.  The location of the source mode has no
>> influence on how it is cached, unlike in traditional systems, and the
>> date-time value of the file is also ignored due to the fact
>> that many hosting environments only allow FTP access, which is not
>> generally guaranteed to preserve the time stamp of files during
>> uploaded.
>>
>> To simplify things, the system mandates that any and all source files
>> can fit into available memory.  Large source files, of
>> gigabytes in size, are thus not supported, which really shouldn't be a
>> problem in real life.
>>
>> This design makes use of a two-level cache:
>> 1. The first cache is the SHA-512 cache, which maps a ( path, time,
>> data ) triplet into an SHA-512 value in such a way that the
>>    data block is not read from disk unless the path+time is missing in
>>
> the cache, in which case the cache item is recomputed.2. The second
>
>
>> cache is the module cache, which maps an SHA-512 value into a
>> ready-to-use module (a sequence of opcodes).
>>
>> These two caches together are expected to eliminate 90+ percent of all
>> checksum calculations and source file compilation
>> operations.
>>
>> When a new source file needs to processed, the driver performs the
>> following steps:
>>     # Create new 'File' object containing the data (lazily loaded),
>> path, size, and time of the file.    create file := new
>> Braceless0.Platform.Disk.File(path)
>>     # Try to retrieve the checksum value from the checksum cache,
>> otherwise compute it and update the checksum cache.    create checksum
>> is SHA512    if not checksums.Lookup(file.Path, file.Time, out
>> checksum):        let checksum := new Checksum(file.Data)        call
>> checksums.Insert(file.Path, file.Time, checksum)
>>     # Try to retrieve the compiled wordcode from the scripts cache,
>> otherwise compile it and update the scripts cache.    create script is
>> Script    if not scripts.Lookup(checksum, out script):        let
>> script := new Script(file)        call scripts.Insert(checksum,
>> script)
>>
>

Reply via email to